1
resposta

Problemas na autenticação com o token

Acompanhei as aulas, baixei o projeto final comparei com o meu feito no curso, na última parte da autenticação das urls com o token armazenado na session storage da erro recebo 401 unauthorized.

{data: "Unauthorized", status: 401, config: {…}, statusText: "Unauthorized", headers: ƒ}
config:
data: {login: "plsc", senha: "123"}
headers: {Accept: "application/json, text/plain, */*", Content-Type: "application/json;charset=utf-8"}
method: "POST"
transformRequest: [ƒ]
transformResponse: [ƒ]
url: "/autenticar"
__proto__: Object
data: "Unauthorized"
headers: ƒ (c)
arguments: (...)
caller: (...)
length: 1
name: ""
prototype: {constructor: ƒ}
__proto__: ƒ ()
[[FunctionLocation]]: angular.min.js:77
[[Scopes]]: Scopes[3]
status: 401
statusText: "Unauthorized"
__proto__: Object

e não acontece o redirect para a pagina de login contudo o token esta gravado na session storage.

token    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InBzbGMiLCJpYXQiOjE1OTYwNTU2ODEsImV4cCI6MTU5NjE0MDI4MX0.TEwB4Es7vXwuWU67h_Y0FwsU3ofgXeS08-hiNvzMoBY    

interceptor.js

angular.module('alurapic')
  .factory('tokenInterceptor', function($window, $q, $location) {

    var interceptor = {};

    interceptor.request = function(config) {
      console.log('enviar o token na requisição');

      config.headers = config.headers || {};
      if($window.sessionStorage.token) {
        console.log('Adiconando token no header da requisição para ser enviado para o servidor.');
        config.headers['x-access-token'] = $window.sessionStorage.token;
      }
      return config;
    };

    interceptor.response = function(response) {
      var token = response.headers('x-access-token');
      if(token != null) {
        $window.sessionStorage.token = token;
        console.log('Armazenando token recebido no navegador:', token);
      }
      return response;
    }

    interceptor.responseError = function(rejection) {
      if(rejection != null && rejection.status == 401) {
        // redirecionar para a parcial de login no angular
        delete $window.sessionStorage.token;
        $location.path('/login');
      }

      return $q.reject(rejection);
    };


    return interceptor;

  });

api/auth.js

var mongoose = require('mongoose');
var jwt = require('jsonwebtoken');

module.exports = function(app) {

  var api = {};
  var model = mongoose.model('Usuario');

  api.autentica = function(req, res) {

  model
    .findOne({
      login: req.body.login, 
      senha: req.body.senha
    })
    .then(function(usuario) {
      if(!usuario) {
        console.log('Login e senha inválidos!');
        res.sendStatus(401);
      } else {
        // criar o token
        console.log(usuario.login);
        var token = jwt.sign( {login: usuario.login}, app.get('secret'), {
            expiresIn: 84600 // esse valor equivale a 24 horas
        });

        console.log('Token adicionado na resposta...!');
        res.set('x-access-token', token);
        res.end();
      }    
    });
  };

  api.verificaToken = function(req, res, next) {

    var token = req.headers['x-access-token'];

    if(token) {
      console.log('Token recebido, decodificando...!');
      jwt.verify(token, app.get('secret'), function(err, decoded) {
        if (err) {
          console.log('Token rejeitado');
          return res.sendStatus(401);
        } else {
          console.log('Token aceito: ',token);
          req.usuario = decoded;
          next();
        }
      });
    } else {
      console.log('Nenhum token enviado pslc');
      return res.sendStatus(401);
    }
  }
  return api;
};
1 resposta

Fala ai Ana, tudo bem? Olhando os códigos, eles parecem corretos, estranho não redirecionar para o login quando ocorre erro 401.

Tente adicionar um log dentro do responseError e verifique se ele será chamado:

interceptor.responseError = function(rejection) {
    console.log(rejection)
    // ...
}

Verifique também o valor da propriedade status.

Espero ter ajudado.