(八)Node接口搭建——使用passport-jwt验证token

补充知识:用户登录成功后,会返回一个token,这个token相对于一把钥匙,你拿到这把钥匙之后就可以去请求相应的数据,比如说你想拿到数据库里的信息就必须带着这个钥匙(令牌)去拿。

本节使用passport-jwtpassport中间件来验证 token。

passport-jwt是一个针对jwt的插件,passport是express框架的一个针对密码的中间件。

1、安装passport-jwt和passport

npm install passport-jwt

npm install passport

2、入口文件server.js中引入passport

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

3、入口文件server.js中初始化passport

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

4、对passport进行一些配置

  • 在config下面新建一个passport.js文件
  • 将此passport.js文件在入口文件中引入

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

  • 在passport中引入passport-jwt、mongoose、keys.js、models/Users.js
// passport.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);
     }));
}

5、在api/user.js中做密码的验证

  • 在api/user.js中引入passport

const passport = require("passport"); *//引入passport中间件*

  • 验证token得到用户信息
//$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"}); 
})

6、用postman来测试接口

前提:把之前的login接口里面的token改为:token: "Bearer " + token,这才是标准格式

  • 在/current下使用key:Authorization;value:token值来测试是否成功。(token值是测试登录接口生成的值)
测试

终端输出

测试成功可以打印用户信息,我们就可以用jwt_payload来登录。

7、修改passport里面的export

在passport中已经得到了对应的内容,就可以对得到的内容进行查询

module.exports = passport => {
    passport.use(new JwtStrategy(opts, function (jwt_payload, done) {
        // console.log(jwt_payload);
        // 在passport中已经得到了对应的内容,就可以对得到的内容进行查询
        User.findById(jwt_payload.id)
            .then(user=>{  //查询到返回一个用户
                if(user){  //判断用户是否存在
                    return done(null,user); //把user返回回去
                }

                //不存在,返回一个false
                return done(null,false);
            })
            .catch(err=>{
                console.log(err);
            })
    }));
}

此时用Postman 测试接口会返回{"msg":"success"},说明已经成功返回了,我们只需在成功返回那里修改成我们需要返回的用户信息就可以了。

8、修改current接口返回的信息

//current接口
// $route GET api/users/current
// @desc return current user
// @access Private
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,验证成功之后获得用户信息。

你可能感兴趣的:((八)Node接口搭建——使用passport-jwt验证token)