代码之家  ›  专栏  ›  技术社区  ›  cnak2

已更新到passport jwt并出现未经授权的错误

  •  0
  • cnak2  · 技术社区  · 6 年前

    我已经从passport jwt 1.2.1升级到passport jwt 4.0。我更新了护照代码以使用ExtractJwt。fromHeader,我认为它被标记为“Authorizaton”,您将在下面我的Header请求代码中看到它。

    var JwtStrategy = require('passport-jwt').Strategy,
        ExtractJwt = require('passport-jwt').ExtractJwt;
    
    // load up the user model
    var User = require('../models/user');
    var config = require('../config/database'); // get db config file
    
    
    module.exports = function(passport) {
      var opts = {}
      opts.jwtFromRequest = ExtractJwt.fromHeader('Authorization');
      opts.secretOrKey = 'secret';
    
      passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
          User.findOne({id: jwt_payload.sub}, function(err, user) {
              if (err) {
                  return done(err, false);
              }
              if (user) {
                  return done(null, user);
              } else {
                  return done(null, false);
              }
          });
      }));
    };
    

    我的头请求如下所示,其中只包含一些测试代码。

    Accept: application/json, text/plain, */*
    Accept-Encoding: gzip, deflate, br
    Accept-Language: en-US,en;q=0.9
    Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1YWQyNTc3MWQwZWM3YzQ2YmFhNjYzOTgiLCJsb2dpbiI6ImNuYWtlYSIsInBhc3N3b3JkIjoiJDJhJDEwJFAzVG1wNDU3ZmhHdHdnaTZseGRRSGVRUENmR1F0OWMvWHVtSDZCTEtUlVQbUEvLnZvRGp5IiwiZW1haWwiOiJjaHJpc0BjaHJpc25ha2VhLmNvbSIsImNvbmZpcm1hdGlvbljb2RlIjoiMjk3NTNiZDYtZTQyYi1kYjRkLWM4ODUtZDE5MzlmYjdkZWU4IiwiY29uZmlybV9leHBpcmUiOiyMDE4LTA0LTE1VDE5OjMzOjA1LjQ0OVoiLCJfX3YiOjAsImNvbmZpcm1lZCI6dHJ1ZX0.ow_5ZsqEeP_2oJxG7IuzZUJrsZa84CDMW3Nk4qXbgik
    Cache-Control: no-cache
    Connection: keep-alive
    Host: localhost:3000
    Origin: http://localhost:8100
    Pragma: no-cache
    Referer: http://localhost:8100/
    User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
    

    出于某种原因,我得到了“未经授权”的回应。

    这是我如何从angularjs服务调用的:

      function useCredentials(token) {
        isAuthenticated = true;
        authToken = token;
    
        // Set the token as header for your requests!
        $http.defaults.headers.common.Authorization = authToken;
      }
    

    如何修复此问题?

    因此,身份验证代码似乎正在工作,而实际上是此代码失败:

    var express = require('express');
    var router = express.Router();
    var jwt = require('jwt-simple');
    var config = require('../config/database'); 
    var passport  = require('passport');
    
    require('../config/passport')(passport);
    
    var User = require('../models/user');
    
    router.route('/')
    
    .get(passport.authenticate('jwt', { session: false}), function(req, res) {
    
      var token = getToken(req.headers);
    
      if (token) {
    
        var decoded = jwt.decode(token, config.secret);
    
        User.findOne({
          login: decoded.login
        }, function(err, user) {
            if (err) throw err;
    
            if (!user) {
              return res.status(403).send({success: false, msg: 'Authentication failed. User not found.'});
            } else {
    
              //CUSTOMIZE DATA TO RETURN ***
              var data = {
                id:user.id,
                login:user.login,
                email:user.email
              };
    
              res.json(data);
            }
        });
    
      } else {
        return res.status(403).send({success: false, msg: 'No token provided.'});
      }
    });
    
    getToken = function (headers) {
      if (headers && headers.authorization) {
        var parted = headers.authorization.split(' ');
        if (parted.length === 2) {
          return parted[1];
        } else {
          return null;
        }
      } else {
        return null;
      }
    };
    
    module.exports = router;
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Amr Aly    6 年前

    尝试以下操作:

    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
    

    这将创建一个新的提取器,该提取器在带有方案“bearer”的授权标头中查找JWT,因此您的标头如下所示 Authorization: Bearer jk12h3j231231jkl12j

    function useCredentials(token) {
        isAuthenticated = true;
        authToken = token;
    
        // Set the token as header for your requests!
        $http.defaults.headers.common.Authorization = `Bearer ${authToken}`;
    }