📜  简单的 jwt (1)

📅  最后修改于: 2023-12-03 15:41:08.973000             🧑  作者: Mango

简单的 JWT

什么是 JWT?

JWT 全称为 JSON Web Token,是一种用于身份验证和授权的开放标准(RFC 7519)。它是一种安全的、轻量级的跨域身份验证方式,可以在不需要再次查询数据库的情况下,直接从服务端验证数据的真实性和有效性。

JWT 的结构

一个 JWT 包含三个部分:Header、Payload、Signature。

Header

Header 通常由两部分组成:令牌的类型和加密算法。例如:

{
  "alg": "HS256",
  "typ": "JWT"
}

其中 alg 表示加密算法,typ 表示令牌的类型。

Payload

Payload 是 JWT 中真正包含信息的部分,通常可以包含用户的 id、角色、权限等信息。例如:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

在 Payload 中可以自定义添加自己需要的信息。

Signature

Signature 是最后一部分,主要是用于验证令牌的真实性,由 Header、Payload 和 Secret Key 三部分组成,例如:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

其中,base64UrlEncode() 表示对 JSON 进行加密后再进行 URL 安全的 Base64 编码。

JWT 的使用

下面我们基于 Node.js 来实现一个简单的 JWT 鉴权验证流程。

首先我们需要安装两个库:

npm install --save jsonwebtoken express

然后是我们的代码实现:

const express = require('express')
const jwt = require('jsonwebtoken')

const app = express()

app.get('/api/login', (req, res) => {
  // 用户登录成功后,生成一个 JWT
  const token = jwt.sign({ id: '123456' }, 'my_secret_key')

  // 返回 JWT
  res.json({ token })
})

// JWT 中间件,用于鉴权
const auth = (req, res, next) => {
  const token = req.headers.authorization

  try {
    // 验证 JWT
    const decoded = jwt.verify(token, 'my_secret_key')

    // 验证成功,将用户信息存储在 req 上,方便后续使用
    req.user = decoded

    next()
  } catch (err) {
    // 验证失败,返回错误信息
    res.status(401).json({ message: 'Authentication failed' })
  }
}

app.get('/api/userinfo', auth, (req, res) => {
  // 获取当前用户信息
  const user = req.user

  res.json(user)
})

app.listen(3000, () => console.log('Server started on http://localhost:3000'))

以上就是一个简单的 JWT 鉴权验证流程,其中重点是使用 jsonwebtoken 库来生成和验证 JWT。在实际使用过程中,需要注意生成和存储 Secret Key 的安全性,以及 JWT 过期时间等问题。