1. 程式人生 > >node.js搭建介面(七):Node-使用passport-jwt驗證token

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,驗證成功之後獲得使用者資訊。