node.js搭建接口(七):Node-使用passport-jwt验证token

本节使用passport-jwt和passport中间件来验证token,passport-jwt是一个针对jsonwebtoken的插件,passport是express框架的一个针对密码的中间件

那么首先还是需要安装passport-jwt和possport

npm install passport-jwt
npm install passport

然后在入口文件server.js中引入passport

const passport = require("passport");       //引入passport插件

To use Passport in an Express or Connect-based application, configure it with the required passport.initialize() middleware.

在入口文件中初始化passport

app.use(passport.initialize());     //passport初始化

接下来我们还需要对passport进行一些配置,所以在config下面新建一个passport.js文件。然后将此文件在入口文件中引入

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

然后在passport文件中,我们需要使用passport-jwt中间件,所以我们需要在passport中引入passport-jwt、mongoose、keys.js、models/Users.js

var JwtStrategy = require('passport-jwt').Strategy,
    ExtractJwt = require('passport-jwt').ExtractJwt;
    const mongoose = require("mongoose");
    const User = mongoose.model("users");
    const keys = require("../config/keys");
var opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();  //通过配置信息来生成jwt的请求,验证这个token
opts.secretOrKey = keys.secretOrKey;

module.exports = passport =>{
     passport.use(new JwtStrategy(opts,function(jwt_payload,done){
        console.log(jwt_payload);
     }));
}

随后在api/user.js中做密码的验证,首先在文件中引入passport

const passport = require("passport");     //引入passport中间件
//$route GET api/users/current
//@desc return current user
//@access private
//验证token得到用户信息
//使用passport-jwt验证token
router.get("/current",passport.authenticate("jwt",{session:false}),(req,res)=>{
    res.json({msg:"success"}); 
})

此时可以使用postman来测试接口,在/current下使用key:Authorization;value:token值来测试是否成功。如果测试成功可以打印出用户信息,我们就可以用jwt_payload来登录。将passport里面的export修改为下面:

module.exports = passport =>{
     passport.use(new JwtStrategy(opts,function(jwt_payload,done){
        // console.log(jwt_payload);   //jwt_payload就是用户信息
        User.findById(jwt_payload.id)
            .then(user =>{
            	if(user){
            		return done(null,user);
            	}
            	return done(null,false);
            })
            .catch(err => console.log(err));
     }));
}

此时再用postman测试接口会返回

{
    "msg": "success"
}

我们应该让他返回用户信息,修改user.js中的路由返回值

router.get("/current",passport.authenticate("jwt",{session:false}),(req,res)=>{
    res.json(req.user); 
})

此时再用postman测试将返回token所对应的用户信息

但是我们并不需要返回所有的用户信息,包括密码什么的,所以我们使用一个对象,将部分用户信息包装在对象中来显示部分用户信息

router.get("/current",passport.authenticate("jwt",{session:false}),(req,res)=>{
    res.json({
        id:req.user.id,
        name:req.user.name,
        email:req.user.email
    }); 
})

此时在用postman测试将只会显示部分用户信息。

总结一下,在上一节中主要是为了获取用户的token,token就像一个令牌,我们只有拿这个令牌才能向服务器去请求用户的信息,这一节我们使用/current接口,用passport-jwt来验证token,验证成功之后获得用户信息。


版权声明:本文为djjj123456789原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。