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