补充知识:用户登录成功后,会返回一个token,这个token相对于一把钥匙,你拿到这把钥匙之后就可以去请求相应的数据,比如说你想拿到数据库里的信息就必须带着这个钥匙(令牌)去拿。
本节使用passport-jwt
和passport
中间件来验证 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,验证成功之后获得用户信息。