2016-01-18 3 views
0

Проблема: Satellizer не отправляет заголовок авторизации на сервер.Satellizer.Js не отправляет заголовок авторизации на сервер

Я пытаюсь использовать Satellizer.Js по проекту, над которым я работаю. Замечательно, однако, что это неправильная отправка заголовка авторизации в запросе на сервер (Примечание: я использую узел для бэкэнд). Это не проблема CORS, поскольку я работаю с localhost на данный момент. Когда я локально регистрирую/регистрирую, сервер отвечает токеном, а Satellizer правильно устанавливает это в локальном хранилище. Я проверяю вкладку «Сеть» в инструментах «dev», чтобы проверить заголовки, но не заголовок авторизации. Кто-нибудь имеет дело с этим, или есть идеи/советы, которые я могу использовать? Заранее спасибо.

Вот мой server.js код:

var express = require('express'), 
app = express(), 
path = require('path'), 
cors = require('cors'), 
bodyParser = require('body-parser'), 
mongoose = require('mongoose'), 
config = require('./config/config'), 
morgan = require('morgan'), 
port = process.env.PORT || 8080; 


var express = require('express'), 
app = express(), 
path = require('path'), 
cors = require('cors'), 
bodyParser = require('body-parser'), 
mongoose = require('mongoose'), 
config = require('./config/config'), 
morgan = require('morgan'), 
port = process.env.PORT || 8080; 


//connect to the database 
mongoose.connect(config.db); 
//morgan - log all requests to the console 
app.use(morgan('dev')); 

//middleware for body parser 
app.use(bodyParser.urlencoded({extended:true})); 
app.use(bodyParser.json()); 

//handle CORS requests 
app.use(cors()); 
/*app.use(function(req,res,next){ 
    res.setHeader('Access-Control-Allow-Origin', '*'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST'); 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, content-type, \ Authorization'); 
    next(); 
});*/ 

//set the location for static files 
app.use(express.static(__dirname + '/public')); 

//API Routes 
var apiRoutes = require('./app/routes/app-routes.js')(app,express); 

app.use('/auth', apiRoutes); 

//send the users to the front end 
app.get('*', function(req,res){ 
    res.sendFile(path.join(__dirname + '/public/app/views/index.html')); 
}); 


//listen on port 
app.listen(port, function(){ 
    console.log('Listening on port: ' + port + "...."); 
}); 

Здесь, где лексем получает набор на угловой стороне с satellizer:

vm.login = function(){ 
     $auth.login({email: vm.user.email, password: vm.user.password}) 
      .then(function(res){      
       //check for token; 
       if(!res.data.token){ 
        vm.error = true; 
        vm.errorMessage = res.data.message; 
       }else{ 
        //redirect to the dashboard 

        $location.path('/dashboard'); 
       }  
      }) 
      .catch(function(){ 
       vm.error = true; 
       vm.errorMessage = "Failed to login, please try again." 
      }); 
    }; 

Здесь мой единственный аутентифицирован маршрут:

router.get('/dashboard', ensureAuthenticated, function(req,res){ 
    //with a validated token 
    console.log(req.headers); 
    console.log(req.headers.authorization); 
    res.json({success: true, message:'You made it, congrats!'}); 
}); 

Это моя функция создания-token, и это мое промежуточное ПО для проверки подлинности:

function createToken(user){ 
    var payload = { 
     exp: moment().add(14, 'days').unix, 
     iat: moment().unix(), 
     sub: user._id 
    } 
    return jwt.encode(payload,config.secret); 
}; 

function ensureAuthenticated(req, res, next) { 
      if (!req.headers.authorization) { 
      return res.status(401).send({ message: 'Please make sure your request has an Authorization header' }); 
      } 
      var token = req.headers.authorization.split(' ')[1]; 

      var payload = null; 
      try { 
      payload = jwt.decode(token, config.secret); 
      } 
      catch (err) { 
      return res.status(401).send({ message: err.message }); 
      } 

      if (payload.exp <= moment().unix()) { 
      return res.status(401).send({ message: 'Token has expired' }); 
      } 
      req.user = payload.sub; 
      next(); 
    } 

Примечание: Satellizer.Js $ httpInterceptor отвечает за отправку токена в запросе. Вот этот код: установка

.factory('SatellizerInterceptor', [ 
    '$q', 
    'SatellizerConfig', 
    'SatellizerStorage', 
    'SatellizerShared', 
    function($q, config, storage, shared) { 
    return { 
     request: function(request) { 
     if (request.skipAuthorization) { 
      return request; 
     } 

     if (shared.isAuthenticated() && config.httpInterceptor(request)) { 
      var tokenName = config.tokenPrefix ? config.tokenPrefix + '_' + config.tokenName : config.tokenName; 
      var token = storage.get(tokenName); 

      if (config.authHeader && config.authToken) { 
      token = config.authToken + ' ' + token; 
      } 

      request.headers[config.authHeader] = token; 
     } 

     return request; 
     }, 
     responseError: function(response) { 
     return $q.reject(response); 
     } 
    }; 
    }]) 
.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.interceptors.push('SatellizerInterceptor'); 
}]); 
+0

Опубликуйте свой код Angular и Node.js вместе с конфигурацией CORS. Это очень маловероятно, что Satellizer нарушен. – krl

+0

@kyrylkov добавил мой код :) – elloM8

+0

Так это сработало, когда и угловой код, и приложение Node.js, где на localhost? Развернуто ли развертывание удаленно, ваше Угловое приложение размещено в другом домене с сервера Node.js? – krl

ответ

0

Try заголовок Authorization, как это ...

request.headers.Authorization = token; 
+0

К сожалению, явная настройка заголовков не работает. Satellizer должен сделать это на своем собственном, хотя .. – elloM8

+0

Вы попробовали мое предложение? –

+0

Да, я попробовал, но не повезло:/ – elloM8

0

Что ваша мотивация установки token вручную с $auth.setToken, когда Satellizer заботится о ней автоматически, когда $auth.login используется?

Вот Satellizer пример Логин, который прекрасно работает в наших программах:

angular.module('MyApp') 
    .controller('LoginCtrl', function($scope, $location, $auth, toastr) { 
    $scope.login = function() { 
     $auth.login($scope.user) 
     .then(function() { 
      toastr.success('You have successfully signed in!'); 
      $location.path('/'); 
     }) 
     .catch(function(error) { 
      toastr.error(error); 
     }); 
    }; 
    }); 

Итог: вы не должны установить token себя. Satellizer делает это автоматически за кулисами.

+0

Мне только жаль, что это был ответ. Я установил там токен, когда я отлаживал. :/ – elloM8

+1

@ elloM8 Проблема на вашей стороне. Клонировать и запустить каталог примеров 'Satellizer' и посмотреть, работает ли он так. – krl

+0

Да, проблема, безусловно, на моем конце. Клонирование и управление репо отлично работало. По крайней мере, я знаю, что это не ошибка со спутниками. – elloM8

0

У меня была та же проблема. Вы должны отправить все запросы с префиксом «/ api /». Без этого префикса я получил ошибку, но w

Смежные вопросы