生成令牌用到的插件包是: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} = dataconst 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 = 200ctx.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').secretOrKeyconst JwtStrategy = require('passport-jwt').Strategy,ExtractJwt = require('passport-jwt').ExtractJwtconst opts = {}opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken()opts.secretOrKey = secretOrKeyconst 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模拟如下图:
