美文网首页
(八)Node接口搭建——使用passport-jwt验证tok

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

作者: 彼得朱 | 来源:发表于2019-07-08 20:32 被阅读0次

    补充知识:用户登录成功后,会返回一个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验证tok

          本文链接:https://www.haomeiwen.com/subject/xhfzhctx.html