生成令牌用到的插件包是:jsonwebtoken
npm地址:https://www.npmjs.com/package/jsonwebtoken
1、安装包
涉及到的包:
包名称 | 安装方式 | 包作用 |
---|---|---|
jsonwebtoken | npm install jsonwebtoken —save | 生成token令牌 |
koa-passport | npm install koa-passport -D | 帮助我们拿到前端传递来的token |
passport-jwt | npm install passport-jwt -D | passport的扩展包,用于验证令牌 |
2、生成token
方法写在config/tools.js中:
const jwt = require('jsonwebtoken')
const tools = {
/***
* 生成token
* @desc data是token需要加密的用户信息,解析token可以返回data信息
* @desc 第一个参数是隐藏信息,第二个参数是关键字,第三个参数是过期时间单位秒
* **/
setToken(data) {
// 取出需要加入token的用户信息
const {id, phone, name} = data
const payload = {id, phone, name}
const token = jwt.sign(payload, 'secret', { expiresIn: 60 * 60 })
return token
}
}
module.exports = tools
在登录接口返回token,部分代码如下:
// 用户密码验证通过后返回token,固定格式前面要带有Bearer + 空格
const token = tools.setToken(user)
ctx.status = 200
ctx.body = {
code: 200,
msg: '登录成功',
token: `Bearer ${token}`
}
postman效果如下:
3、解析token
我们给了前端token后,前端会将token放在请求头的Authorization中携带上来,如图:
此时需要我们解析token。获取token中包含的登陆者信息,以及token的合法性等~
要解析token,我们用到两个插件,koa-passport和passport-jwt,具体使用方法在npm官网有解释。
在config/passport.js文件中,我们设置解析token的方法。
const secretOrKey = require('./keys').secretOrKey
const JwtStrategy = require('passport-jwt').Strategy,
ExtractJwt = require('passport-jwt').ExtractJwt
const opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken()
opts.secretOrKey = secretOrKey
const mongoose = require('mongoose')
const User = mongoose.model('users') // 获取数据库users表
module.exports = passport => {
passport.use(new JwtStrategy(opts, async (jwt_payload, done) => {
// 此处的jwt_payload就是解析后的payload,里面包含phone,name,id信息,也就是我们设置token时候加入的payload
/**User.findOne({id: jwt_payload.sub}, function(err, user) {
if (err) {
return done(err, false)
}
if (user) {
return done(null, user)
} else {
return done(null, false)
}
});**/
}))
}
token的解析会发生在我们接口调用带着Authorization参数上去的时候。
比如说,在routers/api/users.js中我们有接口如下:
const passport = require('koa-passport')
router.get(
'/current',
passport.authenticate('jwt', { session: false }),
async (ctx) => {
// 返回除password之外的必要信息
ctx.body = {
id: ctx.state.user.id,
name: ctx.state.user.name,
email: ctx.state.user.email,
avatar: ctx.state.user.avatar,
};
}
);
当然passport插件首先要在app.js中注册使用,具体可以去查看源代码。
postman模拟如下图: