JWT是什么

  • JSON Web Token是一个开放标准(RFC7519)
  • 定义了一种紧凑且独立的方式,可以将各方之间的信息作为json对象进行安全传输
  • 该信息可以验证和信任,因为是经过数字签名的。

JWT的构成

  • Header

    • typ

      TOKEN的类型,固定为JWT

    • alg

      使用hash算法

  • Payload

    • 存储需要传递的信息,如用户ID、用户名等

    • 还包含元数据,如过期时间、发布人等

    • 与 Header不同, Payload可以加密

  • Signature

    • 对 Header和 Payload部分进行签名

    • 保证 Token在传输的过程中没有被篡改或者损坏

NodeJs中使用JWT

  1. 安装jsonwebtoken

    1
    yarn add jsonwebtoken
  2. 使用

    1
    2
    const jsonwebtoken = require('jsonwebtoken')
    const token = jsonwebtoken.sign({ _id, name }, secret, { expiresIn: "1d" })
    • 第一个参数

      需要存放的信息

    • 第二个参数

      加密的密钥

    • 第三个参数

      过期时间

用户认证与授权

用户认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const jsonwebtoken = require('jsonwebtoken')
const auth = async (ctx, next) => {
const { authorization = '' } = ctx.request.header
const token = authorization.replace("Bearer ", '')
try {
const user = jsonwebtoken.verify(token, secret)
ctx.state.user = user
} catch (err) {
ctx.throw(401, err.message)
}
await next()
}
// 在需要认证的路由中使用中间件
router.patch('/:id', auth, update)
router.delete('/:id', auth, del)

授权

授权建立在认证的基础上。因此授权我们再写一个中间件。

1
2
3
4
5
6
async checkOwner (ctx, next) {
if (ctx.params.id !== ctx.state.user._id) {
ctx.throw(403, '你没有权限')
}
await next()
}

在认证中间件后继续引用。

1
2
router.patch('/:id', auth, checkOwner, update)
router.delete('/:id', auth, checkOwner, del)

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

  1. 安装koa-jwt

    1
    yarn add koa-jwt
  2. 使用

    1
    2
    3
    const jwt = require('koa-jwt')
    // 加密密钥
    const auth = jwt({ secret })