生成令牌用到的插件包是: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中:

  1. const jwt = require('jsonwebtoken')
  2. const tools = {
  3. /***
  4. * 生成token
  5. * @desc data是token需要加密的用户信息,解析token可以返回data信息
  6. * @desc 第一个参数是隐藏信息,第二个参数是关键字,第三个参数是过期时间单位秒
  7. * **/
  8. setToken(data) {
  9. // 取出需要加入token的用户信息
  10. const {id, phone, name} = data
  11. const payload = {id, phone, name}
  12. const token = jwt.sign(payload, 'secret', { expiresIn: 60 * 60 })
  13. return token
  14. }
  15. }
  16. module.exports = tools

在登录接口返回token,部分代码如下:

  1. // 用户密码验证通过后返回token,固定格式前面要带有Bearer + 空格
  2. const token = tools.setToken(user)
  3. ctx.status = 200
  4. ctx.body = {
  5. code: 200,
  6. msg: '登录成功',
  7. token: `Bearer ${token}`
  8. }

postman效果如下:
image.png

3、解析token

我们给了前端token后,前端会将token放在请求头的Authorization中携带上来,如图:
image.png
此时需要我们解析token。获取token中包含的登陆者信息,以及token的合法性等~

要解析token,我们用到两个插件,koa-passport和passport-jwt,具体使用方法在npm官网有解释。
在config/passport.js文件中,我们设置解析token的方法。

  1. const secretOrKey = require('./keys').secretOrKey
  2. const JwtStrategy = require('passport-jwt').Strategy,
  3. ExtractJwt = require('passport-jwt').ExtractJwt
  4. const opts = {}
  5. opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken()
  6. opts.secretOrKey = secretOrKey
  7. const mongoose = require('mongoose')
  8. const User = mongoose.model('users') // 获取数据库users表
  9. module.exports = passport => {
  10. passport.use(new JwtStrategy(opts, async (jwt_payload, done) => {
  11. // 此处的jwt_payload就是解析后的payload,里面包含phone,name,id信息,也就是我们设置token时候加入的payload
  12. /**User.findOne({id: jwt_payload.sub}, function(err, user) {
  13. if (err) {
  14. return done(err, false)
  15. }
  16. if (user) {
  17. return done(null, user)
  18. } else {
  19. return done(null, false)
  20. }
  21. });**/
  22. }))
  23. }

token的解析会发生在我们接口调用带着Authorization参数上去的时候。
比如说,在routers/api/users.js中我们有接口如下:

  1. const passport = require('koa-passport')
  2. router.get(
  3. '/current',
  4. passport.authenticate('jwt', { session: false }),
  5. async (ctx) => {
  6. // 返回除password之外的必要信息
  7. ctx.body = {
  8. id: ctx.state.user.id,
  9. name: ctx.state.user.name,
  10. email: ctx.state.user.email,
  11. avatar: ctx.state.user.avatar,
  12. };
  13. }
  14. );

当然passport插件首先要在app.js中注册使用,具体可以去查看源代码。

postman模拟如下图:
image.png