【问题标题】:passport-jwt in MEAN-Stack returning Internal Server Error 500MEAN-Stack 中的 passport-jwt 返回内部服务器错误 500
【发布时间】:2019-03-29 10:14:42
【问题描述】:

我正在使用 passport.js JWT 策略来验证我的 MEAN-Stack 应用程序。不安全的路由正常工作,但我无法让安全的路由正常工作。即使我坚持使用文档,他们也总是返回内部服务器错误 500。这是代码:

我在应用路由之前在 index.js 中初始化:

server.use(passport.initialize());

我的 passport.js 设置文件:

const JwtStrategy = require('passport-jwt').Strategy,
      ExtractJwt = require('passport-jwt').ExtractJwt;

const User = require('../models/user');

const config = require('../config/db');
module.exports = function(passport) {
let opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = config.secret;

passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
  User.findOne({_id: jwt_payload._id}, function(err, user) {
      if (err) {
          return done(err, false);
      }
      if (user) {
         return done(null, user);
      } else {
         return done(null, false);
      }
  });
}));
};

我的路线不起作用:

const express = require('express');
const router = express.Router();
const config = require('../config/db');
const jwt = require('jsonwebtoken');
const User = require('../models/user');
require('../config/passport');
const passport = require('passport');

router.get('/profile', passport.authenticate('jwt', {session: false}), function(req, 
 res){
     res.json(user);
 });

module.exports = router;

我的令牌设置正确,因为我可以手动解码。

我如何从角度调用这条路线(我知道我实际上不需要调用本身的 userId 参数):

public getProfile(userId) : any{

let httpOptions = {
  headers: new HttpHeaders({ 'Authorization': `Bearer ${this.token}` })
};

this.http.get('http://localhost:8080/api/v1/profile', httpOptions).subscribe(res => {
  console.log('got the profile for user with id: ' + userId + '=> ' + res);
  return res;
}, err => {
  console.log(err);
});
}

感谢任何帮助。提前感谢您的宝贵时间!

编辑:猫鼬日志

Mongoose: users.findOne({ _id: ObjectId("5bcf1218cace7d1168a23672") }, { 
projection: {} })
GET /api/v1/profile 500 4.579 ms - 5
OPTIONS /api/v1/profile 204 0.097 ms - 0
{ _id: '5bcf1218cace7d1168a23672',
 email: '12@email.com',
 password: '$2a$10$z8li41jQMESsmbIyQUsPfO6VkYjOyO/ybj4lW04VGUkJmlShydBN.',
 name: '12',
 age: 12,
 gender: 'male',
 description: '12',
 question: '12',
 __v: 0,
 iat: 1540419498 }
 Mongoose: users.findOne({ _id: ObjectId("5bcf1218cace7d1168a23672") }, { 
 projection: {} })
 GET /api/v1/profile 500 3.995 ms - 5

【问题讨论】:

  • 确认jwt_payload._id已定义
  • 如果我在控制台记录 jwt_payload,我不会得到任何输出
  • confirm new HttpHeaders({ 'Authorization': Bearer ${this.token}` })` 您的令牌已设置或使用 Postman/cURL 测试您的访问令牌

标签: node.js angular express passport.js mean-stack


【解决方案1】:

我添加了单行 cmets 来命中点,验证点并相应地注释以进一步调试。确认/api/v1/ 是快速根路由。

passport.js

const JwtStrategy = require('passport-jwt').Strategy,
const ExtractJwt = require('passport-jwt').ExtractJwt;
const User = require('../models/user');
const config = require('../config/db');

module.exports = function(passport) {
  let opts = {
    secretOrKey: config.secret,
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
    issuer: 'TODO', // configure issuer
    audience: 'TODO' // configure audience
  };

  passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
    console.log(jwt_payload); // confirm _id is defined

    User.findOne({ _id: jwt_payload._id }, function(err, user) {
      if (err) {
          return done(err, false);
      }

      if (!user) {
         return done(null, false);
      }

      return done(null, user);
    });
  }));
};

route.js

const express = require('express');
const passport = require('passport');
const jwt = require('jsonwebtoken');
const config = require('../config/db');
const User = require('../models/user');
const router = express.Router();

require('../config/passport');

router.get('/profile', passport.authenticate('jwt', { session: false }), function(req, res) {
     res.json(req.user); // use req.user not user
});

module.exports = router;

【讨论】:

  • 您好,感谢您抽出宝贵时间。除了设置发行者和受众之外,我做了你所说的一切,因为我不知道该放什么,而且文档也不清楚该放什么。如果我控制台记录 jwt_payload,我不会得到任何输出。我添加了猫鼬日志,也许他们有帮助?
  • 阅读这篇文章了解 JWT 指南和tools.ietf.org/html/rfc7519#section-4.1.1
猜你喜欢
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2021-11-12
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 2021-06-21
相关资源
最近更新 更多