【问题标题】:Passport JWT: Cannot read property '_id' of undefined in MEANPassport JWT:无法读取 MEAN 中未定义的属性“_id”
【发布时间】:2018-06-25 11:58:29
【问题描述】:

我正在使用 express 和 angular 5 构建一个 CMS 我尝试设置护照 JWT 身份验证,但如果我尝试在后端访问受保护的路由,我会不断收到错误消息。

我登录了 jwt_payload,但那里没有 用户。 所以我虽然发送的标头有问题,但看起来不错,“授权”标头包含令牌。

我真的很无奈

这是我的设置:

护照策略

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

module.exports = function(passport){
let opts = {};

opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
opts.secretOrKey = config.secret;
opts.passReqToCallback = true;

passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
    User.getUserById(jwt_payload.user._id, (err, user) => {
        if(err){
            return done(err, false);
        }

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

路线

// Profile
router.post('/profile', passport.authenticate('jwt', {session: false}), (req, res, next) => {
res.json({user: req.user});
});

还有角度服务

getProfile(){
let headers = new Headers();
this.loadToken();
headers.append('Authorization', this.authToken);
headers.append('Content-Type', 'application/json');
console.log(headers)
return this.http.get(API_URL + '/users/profile', {headers : headers})
  .map(res => res.json());
}

验证/登录

router.post('/authenticate', (req, res, next) => {
const username = req.body.username;
const password = req.body.password;

User.getUserByUsername(username, (err, user) => {
if(err) throw err;
if(!user){
  return res.json({success: false, msg: 'User not found'});
}

User.comparePassword(password, user.password, (err, isMatch) => {
  if(err) throw err;
  if(isMatch){

    const token = jwt.sign({user}, config.secret, {
      expiresIn: 604800 // 1 week
    });

    res.json({
      success: true,
      token: 'JWT '+ token,
      user: {
        id: user._id,
        username: user.username,
        email: user.email,
        firstname: user.firstname,
        lastname: user.lastname,
        role: user.role
      }
    });
  } else {
    return res.json({success: false, msg: 'Wrong password'});
  }
});
});
});

这就是 req 中的 jwt_payload

  headers:
 { host: 'localhost:8080',
 connection: 'keep-alive',
 'content-length': '0',
 authorization: 'JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7Il9pZCI6IjVhNWUxYzhlYTI3OWJiMDAyMGZmM2Q5NCIsInVzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6Im1vcm96LmEyNEBnbWFpbC5jb20iLCJmaXJzdG5hbWUiOiJBbGV4IiwibGFzdG5hbWUiOiJNb3JveiIsInBhc3N3b3JkIjoiJDJhJDEwJEdXdk5uVEFtRVVjVEY5SDdtaHg4aE8waHFUaVhqU1oycVVUZkFXTzdGOEE5amZDNXFXT015IiwiX192IjowLCJyb2xlIjoiYWRtaW4ifSwiaWF0IjoxNTE2MTIzNDY5LCJleHAiOjE1MTY3MjgyNjl9.X7iVs6iGrL1NbSfxxNAUBOXV4M5fITFPvcoRzQ6NPnU',
 'postman-token': 'ac9c9f81-3e51-f7af-2203-7022d13359cf',
 'cache-control': 'no-cache',
 origin: 'chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop',
 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
 'content-type': 'application/json',
 accept: '*/*',
 'accept-encoding': 'gzip, deflate, br',
 'accept-language': 'he-IL,he;q=0.9,en-US;q=0.8,en;q=0.7' },
 rawHeaders:
 [ 'Host',
 'localhost:8080',
 'Connection',
 'keep-alive',
 'Content-Length',
 '0',
 'Authorization',
 'JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7Il9pZCI6IjVhNWUxYzhlYTI3OWJiMDAyMGZmM2Q5NCIsInVzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6Im1vcm96LmEyNEBnbWFpbC5jb20iLCJmaXJzdG5hbWUiOiJBbGV4IiwibGFzdG5hbWUiOiJNb3JveiIsInBhc3N3b3JkIjoiJDJhJDEwJEdXdk5uVEFtRVVjVEY5SDdtaHg4aE8waHFUaVhqU1oycVVUZkFXTzdGOEE5amZDNXFXT015IiwiX192IjowLCJyb2xlIjoiYWRtaW4ifSwiaWF0IjoxNTE2MTIzNDY5LCJleHAiOjE1MTY3MjgyNjl9.X7iVs6iGrL1NbSfxxNAUBOXV4M5fITFPvcoRzQ6NPnU',
 'Postman-Token',
 'ac9c9f81-3e51-f7af-2203-7022d13359cf',
 'Cache-Control',
 'no-cache',
 'Origin',
 'chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop',
 'User-Agent',
 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
 'Content-Type',
 'application/json',
 'Accept',
 '*/*',
 'Accept-Encoding',
 'gzip, deflate, br',
 'Accept-Language',
 'he-IL,he;q=0.9,en-US;q=0.8,en;q=0.7' ]

【问题讨论】:

  • 你的jwt_payload是什么样的?
  • 你是如何签署你的有效载荷的?您是否检查了负责创建 JWT 令牌的路由?创建后你记录了吗?我没有看到您的问题中发布的代码,您应该添加它。同样来自我个人的错误..检查您的标题是否是护照所期望的-“授权”:“持票人 TOKEN_STRING”。
  • 添加了 jwt_payload 和 Authenticate

标签: node.js angular jwt passport.js


【解决方案1】:

试试

console.log(JSON.stringify(jwt_payload));

并检查是否有一个名为_id的属性。

【讨论】:

    【解决方案2】:

    里面:

    passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
        User.getUserById(jwt_payload.user._id, (err, user) => {
            if(err){
                return done(err, false);
            }
    
            if(user){
                return done(null, user);
            } else {
                return done(null, false);
            }
        });
    }));
    

    改变:

     User.getUserById(jwt_payload._id, (err, user) => { 
    

    原因:

    console.log(jwt_payload.user._id)
    

    未定义

    但是

    console.log(jwt_payload._id)
    

    会给你用户ID。

    这解决了我的问题。希望它可以帮助某人。

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 2017-06-15
      • 1970-01-01
      • 2022-07-27
      • 2013-09-03
      • 2022-09-23
      • 2018-11-30
      • 2019-09-13
      • 1970-01-01
      相关资源
      最近更新 更多