介绍

Json Web Token

image.png

构成

image.png

Header

typ

token类型,

alg

指定hash算法

Payload

image.png

Signature

image.png
image.png

示列:

image.png

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
p9zvxkUcmyjQaOJWeGhgPp0s-3jjQ2jGtsbFIi0wsOU

工作原理

image.png

实战

image.png

安装jwt

  1. npm i jsonwebtoken --save

生成签名

  1. // Header + Payload + Signature
  2. // 登录的token
  3. const token = jsonWebToken.sign({
  4. _id: res._id,
  5. userName: res.userName
  6. }, config.JWT_SECRET, {
  7. expiresIn: '7d'
  8. });

校验签名

校验token,并获取用户信息 存放在 ctx.state.user

  • jsonwebtoken 实现用户认证与授权

    1. let auth = async (ctx, next) => {
    2. let { authorization } = ctx.header;
    3. // 获取请求头的token
    4. let token = authorization.replace('Bearer ', '');
    5. try {
    6. // 校验token,并获取用户信息
    7. let authData = jsonWebToken.verify(token, config.JWT_SECRET);
    8. let {
    9. _id,
    10. userId,
    11. userName
    12. } = authData;
    13. ctx.state.user = {
    14. _id,
    15. userId,
    16. userName
    17. };
    18. await next();
    19. } catch (e) {
    20. ctx.throw('403', e.message);
    21. }
    22. };
  • koa-jwt 实现用户认证与授权 ```javascript const jwt = require(‘koa-jwt’);

// token 校验 let auth = jwt({secret: config.JWT_SECRET});

  1. <a name="ayufK"></a>
  2. ## koa-jwt
  3. 用koa-jwt中间件实现用户认证与授权
  4. <a name="Q5E2b"></a>
  5. ### 安装koa-jwt
  6. ```bash
  7. npm i koa-jwt --save

使用中间件保护接口

  1. const jwt = require('koa-jwt');
  2. // token 校验
  3. let auth = jwt({secret: config.JWT_SECRET});

使用中间件获取用户信息

  1. // 校验是否当前登录账号
  2. async checkOwner(ctx, next) {
  3. console.log(ctx.state);
  4. if (ctx.params.id !== ctx.state.user._id) { ctx.throw(403, '没有权限'); }
  5. await next();
  6. }