Olá pessoal!
Realizei o curso e estou tendo alguns problemas com a parte de auth. Segui os passos explicados no curso mas quando subo a aplicação, ela está tendo alguns comportamentos estranhos.
Se acesso o localhost:3000 ele não está me redirecionando para a página de login, mesmo eu tendo incluído a rota no main do angular para isso e também ter colocado o o path para /login quando receber uma rejection ou status 401.
Outro comportamento que identifiquei, é que ao acessar um link da aplicação ele me redireciona para a página de login. Até aí tudo bem, é um comportamento já esperado. Porém, quando coloco login o angular recebe o token pelo interceptor.response, no interceptor.request eu tmbm recebo o header com o token, porém continuo recebendo em seguida o status 401.
Já em meu backend eu consigo receber resposta da function de altenticação, porém na function de verificação eu percebi que não estou conseguindo receber o header da requisição:
var mongoose = require('mongoose');
var jwt = require('jsonwebtoken');
module.exports = function(app) {
var api = {};
var model = mongoose.model('User');
api.auth = function(req,res){
model.findOne({
username : req.body.username,
password : req.body.password
})
.then(function(user){
if(!user){
console.log('Usuário/Senha inválidos!');
res.sendStatus(401);
} else {
var token = jwt.sign({username : user.username}, app.get('secret'), {
expiresIn: 84600
});
console.log('Autenticado: token adicionado na resposta');
res.end();
}
});
};
api.tokenVerify = function(req, res, next) {
var token = req.headers['X-NW-Token']; //aqui ele está vindo undefined :(
if(token) {
console.log('Verificando Token...');
jwt.verify(token, app.get('secret'), function(error, decoded) {
if(error){
console.log('Token Rejeitado!');
return res.sendStatus(401);
} else {
console.log('Token Aceito!');
req.user = decoded;
next();
}
});
} else {
console.log('Token não foi enviado');
return res.sendStatus(401);
}
};
return api;
};
Segue os codes da parte do angular:
token-interceptor.js
angular.module('biwebapp')
.factory('tokenInterceptor', function($q, $window, $location) {
var interceptor = {};
interceptor.response = function (response) {
var token = response.headers('X-NW-Token');
if (token) {
$window.sessionStorage.token = token;
console.log('Token armazenado no navegador: ', token);
}
return response;
};
interceptor.request = function(config) {
config.headers = config.headers || {};
if($window.sessionStorage.token) {
config.headers['X-NW-Token'] = $window.sessionStorage.token;
console.log('Adicionando token no header da requisicao para ser enviado ao servidor');
}
return config;
};
interceptor.responseError = function(rejection) {
if(rejection != null && rejection.status == 401) {
delete $window.sessionStorage.token;
$location.path('/login');
}
return $q.reject(rejection);
};
return interceptor;
});
login-controler.js
angular.module('biwebapp')
.controller('LoginController',function($scope, $http, $location) {
$scope.user = {};
$scope.mensagem = '';
$scope.authenticate = function(){
var user = $scope.user;
$http.post('/authenticate', {username : user.username, password : user.password})
.then(function() {
$location.path('/');
}, function(error){
$scope.usuario = {};
$scope.mensagem = 'Usuário ou Senha inválidos!';
});
};
});
main.js
angular.module('biwebapp', ['myDirectives', 'ngRoute', 'ngResource', 'services'])
.config(function($routeProvider, $locationProvider, $httpProvider) {
$locationProvider.html5Mode(true);
$httpProvider.interceptors.push('tokenInterceptor');
$routeProvider.when('/', {
templateUrl: 'partials/index.html',
controller: 'IndexController'
});
$routeProvider.when('/user', {
templateUrl: 'partials/user.html',
});
$routeProvider.when('/clients', {
templateUrl: 'partials/clientList.html',
controller: 'ClientsController'
});
$routeProvider.when('/clients/update/:bi_id_client', {
templateUrl: 'partials/updateClient.html',
controller: 'UpdateClientController'
});
$routeProvider.when('/clients/create', {
templateUrl: 'partials/createClient.html',
controller: 'CreateClientController'
});
$routeProvider.when('/login', {
templateUrl: 'partials/login.html',
controller: 'LoginController'
});
$routeProvider.otherwise({redirectTo: '/'});
});
Desde já agradeço a atenção de todos!