如何使用passport-jwt登录后解码令牌

时间:2016-11-22 05:26:01

标签: node.js token passport.js

我使用passport-jwt对loginin用户的id进行编码,如下所示:

var JwtStrategy   =require('passport-jwt').Strategy;
ExtractJwt = require('passport-jwt').ExtractJwt;
var User          =require('../app/models/usermodel');
var config        =require('../config/database');

module.exports=function(passport){
    var opts = {}; 
    opts.jwtFromRequest = ExtractJwt.fromAuthHeader();
  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) {
              done(null, user);
          } else {
              done(null, false);
          }
      });
  }));
};

和登录路线API:

apiRoutes.put('/login', function(req, res, next){
  User.findOne({email:req.body.email}, function(err, user){
    bcrypt.compare(req.body.password, user.password, function(err, result){
       if(result){
        var token=jwt.encode(user, config.secret);
        return res.json({token:token}); 
      }else{
        return res.json("Incorrect Email and Password")
      }
    })
  })
});

现在我想在仪表板页面中获取登录用户的信息。我试图通过在仪表板API路由中添加身份验证来解码令牌并尝试获取用户的所有信息,如下所示:

apiRoutes.get('/dashboard', passport.authenticate('jwt', { session: false}), function(req, res) {
  console.log('User info: ' + req.user._id + '.');
  });

上面的代码我在解码令牌的教程中找到了。 所以,当我点击这个/api/dashboard url时,它在浏览器控制台中显示错误。

GET http://localhost:3000/api/dashboard 401 (Unauthorized)

我不知道如何解码令牌并获取用户信息。请帮我解决这个问题。

帮助表示感谢。 感谢

2 个答案:

答案 0 :(得分:3)

将令牌传递给jwt-decode

安装jwt-decode

npm i jwt-decode

您可以非常容易地使用它:

import * as jwtDecode from 'jwt-decode';

const payload = jwtDecode(token);

例如,我在nestjs中间件中使用了它:

import { Injectable, NestMiddleware, UnauthorizedException } from '@nestjs/common';
import { Request, Response } from 'express';
import { UserType } from 'src/users/enums/user.enum';
import * as jwtDecode from 'jwt-decode';

@Injectable()
export class ErrorIfNotUser implements NestMiddleware {
  use(req: Request, res: Response, next: Function) {
    const token = req.headers.authorization.slice(7);
    const payload = jwtDecode(token);

    if (payload.type !== UserType.USER) {
      throw new UnauthorizedException(
        'sorry! just type user access to this route',
      );
    }

    next();
  }
}

npm中的jwt-decode:https://www.npmjs.com/package/jwt-decode

答案 1 :(得分:0)

我确定我是对的,但我认为你对快递中的中间件有误解。我找到了一个例子。

var cookieParser = require('cookie-parser');
app.use(cookieParser());

此代码将使用cookieParser()的返回值来解析cookie。这是cookieParser的源代码。

exports = module.exports = function cookieParser(secret, options){
  return function cookieParser(req, res, next) {
    if (req.cookies) return next();
    var cookies = req.headers.cookie;
    // main logic omits
    next();
  };
};

所以你可能会看到cookieParser()的结果 - 这是一个中间件 - 是一个req, res, next作为参数的函数。此外,它还会调用next()让下一个中间件或在您的情况下function(req, res) { console.log('User info: ' + req.user._id + '.'); }运行。

因此,在passport-jwt中,它应该返回一个参数为req, res, next的函数,并调用next()