1.首先安装:
npm install jsonwebtoken
npm install passport-jwt passport
(jsonwebtoken获取token,passport-jwt和passport验证token)
2.在server.js中,首先引入passport:
const passport = require('passport');
app.use(passport.initialize());
如果你想要在其他模块中使用passport,那么还要引入:
require("./config/passport")(passport);
./config/passport是项目下的一个模块,passport是文件中导出的passport
3.得到token:
//得到token
router.post("/login",(req,res) =>{
const email = req.body.email;
const password = req.body.password;
const rule = {id:user.id,name:user.name};
//rule表示传给passport的值
//secret是key
//{expiresIn:100000}表示过期时间单位是秒
jwt.sign(rule,"secret",{expiresIn:100000},(err,token) => {
if(err){
throw err;
}
res.json({
success:true,
//拿到了token
token:"Bearer " + token
});
});
});
4.验证token
执行到passport.authenticate("jwt",{session:false})的时候,代码会找到passport。也就是执行我们步骤五中的代码。
//验证token
router.get("/current",passport.authenticate("jwt",{session:false}),(req,res) => {
// 如果passport是done(null,user) 即返回回来的是查询的用户信息。则res.send,否则箭头函数不执行
res.json({success:true});
})
5.最后补上./config/passport.js中的代码配置:
jwt_payload的值就是发送token的时候,所编写的rule。
譬如我们这里的rule是步骤三中的:
const rule = {id:user.id,name:user.name};
那么kwt_payload也就是一个json数据,里面是user.id和user.name
如果验证成功会返回一个done(null,user),也就是返回找到的user信息,失败则返回false,是否成功的信息传递给验证token的页面也就是步骤4。
const JwtStrategy = require('passport-jwt').Strategy,
ExtractJwt = require('passport-jwt').ExtractJwt;
const mongoose = require("mongoose");
const User = mongoose.model("users");
const keys = require("../config/keys");
const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.secretOrKey;
module.exports = passport => {
passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
User.findById(jwt_payload.id)
.then(user => {
if(user){
return done(null,user);
}
return done(null,false);
}).catch(err => {
console.log(err);
});
}));
};