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

    yarn add jsonwebtoken
  2. 使用

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

      需要存放的信息

    • 第二个参数

      加密的密钥

    • 第三个参数

      过期时间

用户认证与授权

用户认证

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)

授权

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

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

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

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

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

  1. 安装koa-jwt

    yarn add koa-jwt
  2. 使用

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