Skip to content

Jwt

介绍

Json Web Token

  • JSON Web Token(JWT)是一个开放标准(RFC 7519)
  • 它定义了一种紧凑且自包含的方式,用于作为JSON对象在各方之间安全地传输信息。
  • 此信息可以被验证和信任,因为它是数字签名的。

构成

  • Header(头部)
  • Payload (负载)
  • Signature (签名)

typ

token类型

alg

指定hash算法

Payload

  • 存储需要传递的信息,如用户id、用户名等
  • 还包含元数据,如过期时间、发布人等
  • 与Header不同,Payload可以被加密

Signature

  • 对 Header、Payload 进行签名,防止数据篡改
  • 保证Token在传输过程中不被篡改或者伪造

示列:

image.png

eyJhbGciOiJIUz.eyJzdWIiOiIxMjjoxNTE2MjM5MDIyfQ.p9zvxkUcmyjQaOJWe

工作原理

image.png

实战

  • 安装 jsonwebtoken
  • 生成签名
  • 校验签名

安装jwt

bash
npm i jsonwebtoken --save

生成签名

javascript
//  Header + Payload + Signature
//  登录的token
const token = jsonWebToken.sign({
    _id: res._id,
    userName: res.userName
}, config.JWT_SECRET, {
    expiresIn: '7d'
});

校验签名

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

  • jsonwebtoken 实现用户认证与授权
javascript
let auth = async (ctx, next) => {
    let { authorization } = ctx.header;
  	// 获取请求头的token
    let token = authorization.replace('Bearer ', '');
    try {
      	// 校验token,并获取用户信息
        let authData = jsonWebToken.verify(token, config.JWT_SECRET);
        let {
            _id,
            userId,
            userName
        } = authData;
        ctx.state.user = {
            _id,
            userId,
            userName
        };
        await next();
    } catch (e) {
        ctx.throw('403', e.message);
    }
};
  • koa-jwt 实现用户认证与授权
javascript
const jwt = require('koa-jwt');

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

koa-jwt

用koa-jwt中间件实现用户认证与授权

安装koa-jwt

bash
npm i koa-jwt --save

使用中间件保护接口

javascript
const jwt = require('koa-jwt');

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

使用中间件获取用户信息

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