Apifox 帮助文档
帮助文档常见问题Apifox 官网私有化部署
开发者中心
  • 开放 API
  • 更新日志
  • Road Map
  • Apifox Markdown
下载
  • 下载 Apifox
  • 下载 IDEA 插件
  • 下载浏览器扩展
  • Apifox Web 版
帮助文档常见问题Apifox 官网私有化部署
开发者中心
  • 开放 API
  • 更新日志
  • Road Map
  • Apifox Markdown
下载
  • 下载 Apifox
  • 下载 IDEA 插件
  • 下载浏览器扩展
  • Apifox Web 版
  1. 身份验证 & Auth 鉴权指南
  • 帮助中心
  • 更新日志
  • 入门
    • 产品介绍
    • 联系我们
    • 私有化部署
  • 开始使用
    • 下载 Apifox
    • 注册与登录
    • 页面布局
    • 基本概念
    • 快速上手
      • 概述
      • 新建接口
      • 发送接口请求
      • 快捷请求
      • 添加断言
      • 新建测试场景
      • 分享 API 文档
      • 了解更多
    • 基础知识
      • 接口基本信息
        • 请求 URL 与方法
        • 请求参数与请求体
        • 请求头
        • 请求参数编码解码
        • HTTP/2
      • 认证与授权
        • 概述
        • 支持的授权类型
        • Digest Auth
        • OAuth 1.0
        • OAuth 2.0
        • Hawk Authentication
        • Kerberos
        • NTLM
        • Akamai EdgeGrid
        • CA 和客户端证书
      • 响应与 Cookie
        • 概述
        • API 响应
        • 创建和发送 Cookie
        • 实际请求
        • 提取响应示例
      • 请求代理
        • 网页端中的请求代理
        • 分享文档中的请求代理
        • 客户端中的请求代理
      • API Hub
        • API Hub
    • 导入导出数据
      • 概述
      • 手动导入
      • 定时导入
      • 导入设置
      • 导出数据
      • 其它方式导入
        • 导入 OpenAPI/Swagger
        • 导入 Postman
        • 导入 Apipost
        • 导入 Eolink
        • 导入 cURL
        • 导入 Markdown
        • 导入 Insomnia
        • 导入 apiDoc
        • 导入 .har 文件
        • 导入 knife4j
        • 导入 NEI
        • 导入小幺鸡(docway)
        • 导入 Apizza
        • 导入 WSDL
  • 设计 API
    • 概述
    • 新建 API 项目
    • 接口基础知识
    • 请求体多示例配置
    • 响应组件
    • 常用字段
    • 全局参数
    • 历史记录
    • 批量管理
    • 数据模型
      • 概述
      • 新建数据模型
      • 通过 JSON 等生成
      • 高级数据类型
      • 构建数据模型
    • 鉴权组件
      • 概述
      • 创建鉴权组件
      • 使用鉴权组件
      • 在线文档中的鉴权组件
    • 高级功能
      • 接口字段
      • 接口状态
      • 关联测试场景
      • 参数列表外观
      • 接口唯一标识
  • 开发和调试 API
    • 概述
    • 生成请求
    • 发送请求
    • 请求历史
    • 接口用例
    • 动态值
    • 校验响应
    • 文档模式/调试模式
    • 生成代码
    • 环境和变量
      • 概述
      • 全局/环境/临时变量
      • 环境与服务
      • Vault Secrets(密钥库)
        • 功能简介
    • 前后置操作&脚本
      • 概述
      • 断言
      • 提取变量
      • 等待时间
      • 数据库操作
        • 概述
        • MongoDB
        • Redis
        • Oracle
      • 使用脚本
        • 概述
        • 前置脚本
        • 后置脚本
        • 公共脚本
        • pm 脚本 API
        • 使用 JS 类库
        • 响应数据可视化
        • 调用外部程序
      • 脚本示例
        • 断言示例
        • 脚本使用变量
        • 脚本读取/修改接口请求信息
      • 常见问题
        • 如何获取动态参数的真实值并加密?
        • 脚本运行后,提取的数字(bigint)精度丢失应该如何处理?
    • API 调试
      • GraphQL 调试
      • WebSocket 调试
      • Socket.IO 调试
      • SSE 调试
      • SOAP/WebService
      • gRPC 调试
      • 使用请求代理调试
      • Dubbo 调试
        • 新建 Dubbo 接口
        • 调试 Dubbo 接口
        • Dubbo 接口文档
      • TCP(Socket)
        • Socket 接口功能简介
        • 报文数据处理器
  • Mock 数据
    • 概述
    • 智能 Mock
    • 自定义 Mock
    • Mock 优先级
    • Mock 脚本
    • 云端 Mock
    • 自托管 Runner Mock
  • 自动化测试
    • 概述
    • 编排测试场景
      • 新建测试场景
      • 测试步骤间传递数据
      • 测试流程控制条件
      • 从接口/用例同步数据
      • 跨项目导入接口/用例
      • 导出测试场景数据
    • 运行测试场景
      • 运行测试场景
      • 批量运行测试场景
      • 数据驱动测试
      • 定时任务
      • 管理其它项目接口的运行环境
    • 测试报告
      • 测试报告
    • API 测试
      • 集成测试
      • 性能测试
      • 端到端测试
      • 回归测试
    • Apifox CLI
      • 概述
      • 安装和运行 CLI
      • CLI 命令选项
    • CI/CD
      • 概述
      • 与 Jenkins 集成
      • 与 Gitlab 集成
      • 与 Github Actions 集成
      • 与其它更多 CI/CD 平台集成
  • 发布 API 文档
    • 概述
    • 快捷分享
    • 查看 API 文档
    • 发布文档站
    • 页面布局设置
    • 自定义域名
    • AI 相关特性
    • 高级设置
      • 文档站搜索设置
      • 跨域代理
      • 文档站接入 Google Analytics
      • SEO 设置
      • 文档左侧目录设置
      • 文档可见性设置
      • 在线 URL 链接规范
    • API 版本
      • 创建 API 版本
      • 发布 API 版本
      • 快捷分享 API 版本
      • 功能简介
  • 迭代分支
    • 功能简介
    • 新建迭代分支
    • 在迭代分支中改动 API
    • 在迭代分支中测试 API
    • 合并迭代分支
    • 管理迭代分支
  • 管理中心
    • 入驻清单
      • 了解基本概念
      • 团队入驻
    • 管理团队
      • 团队基本操作
      • 团队成员管理
      • 成员角色与权限设置
      • 团队资源
        • 通用 Runner
        • 请求代理 Agent
        • 团队变量
      • 实时协作
        • 团队协作
    • 管理项目
      • 项目基本操作
      • 项目成员管理
      • 通知设置
        • 功能简介
        • 通知对象
        • 通知事件
      • 项目资源
        • 数据库连接
    • 管理组织
      • 单点登录(SSO)
        • 功能简介
        • 为组织配置单点登录
        • 管理用户账号
        • 将组映射到团队
        • Microsoft Entra ID
      • SCIM 用户管理
        • 功能简介
        • Microsoft Entra ID
      • 组织资源
        • 自托管 Runner
  • IDEA 插件
    • 快速上手
    • 生成接口文档
    • 生成数据模型
    • 配置
      • 全局配置
      • 项目内配置
      • 可配置规则
      • 脚本工具
      • Groovy 本地扩展
    • 进阶配置
      • 注释规范说明
      • 框架支持
    • 常见问题
      • 常见问题
  • 浏览器扩展
    • Chrome
    • Microsoft Edge
  • Apifox MCP Server
    • 概述
    • 通过 MCP 使用 Apifox 项目内的 API 文档
    • 通过 MCP 使用公开发布的 API 文档
    • 通过 MCP 使用 OpenAPI/Swagger文档
  • 最佳实践
    • 概述
    • 接口之间如何传递数据
    • 登录态(Auth)如何处理
    • 接口签名如何处理
    • 如何加密/解密接口数据
    • Jenkins 定时触发任务
    • 如何计算 AI 问答成本
    • 与其他成员共用数据库连接配置
    • 通过 CLI 运行包含云端数据库连接配置的测试场景
    • 通过 Runner 运行包含云端数据库连接配置的测试场景
  • 账号&应用设置
    • 账号设置
    • 语言设置
    • 网络代理
    • 快捷键
    • 数据备份与恢复
    • 更新 Apifox
    • API 访问令牌
  • 身份验证 & Auth 鉴权指南
    • 什么是 API Key
    • 什么是 Bearer Token
    • 什么是 JWT
    • 什么是 Basic Auth
    • 什么是 Digest Auth
    • 什么是 OAuth 1.0
    • 什么是 OAuth 2.0
      • 什么是 OAuth 2.0
      • 授权码授权类型
      • 授权码授权类型,带有 PKCE
      • 隐式授权类型
      • 密码凭证授权类型
      • 客户端凭证授权类型
  • 服务与隐私协议
    • 服务协议
    • 隐私协议
    • 服务等级协议
  • 参考资料
    • API 设计优先理念
    • JSON Schema 介绍
    • JSONPath 介绍
    • XPath 介绍
    • Apifox Markdown 语法
    • CSV 格式规范
    • 正则表达式
    • 安装 Java 环境
    • Runner 运行环境
    • 常见编程语言对应的数据类型
    • Socket 粘包和分包问题
    • 词汇表
    • 目录链接汇总
    • Apifox Swagger 扩展
      • 概述
      • x-apifox-folder
      • x-apifox-status
      • x-apifox-name
      • x-apifox-maintainer
    • Apifox JSON Schema 扩展
      • 概述
      • x-apifox-mock
      • x-apifox-orders
      • x-apifox-enum
    • 动态值表达式
  • 常见问题
  1. 身份验证 & Auth 鉴权指南

什么是 JWT

JWT(JSON Web Tokens,RFC 7519)是一种开放标准,用于在网络上安全地传递信息作为 JSON 对象。这些信息可以被验证和信任,因为它们是数字签名的,JWT 可以使用密钥(HMAC 算法)或使用 RSA 或 ECDSA 的公/私钥对进行签名。JWT 通常用于身份验证和信息交换,特别是在 Web 应用程序的单点登录(SSO)场景中很常见。

JWT 的数据结构#

一个 JWT 本质上是一个被编码和加密过的容器,它由三部分组成:头部(header)、载荷(payload)、签名(signature)。头部包含了令牌的元数据和签名算法,载荷包含了需要传输的数据,签名用于验证令牌的完整性。它们使用点号 . 分隔,典型的 JWT 的结构如下所示:
Header.Payload.Signature

Header(头部)#

头部通常包含两部分信息:
令牌类型(typ),即 JWT。
签名算法(alg),比如 HMAC SHA256 或 RSA。
通常,头部采用 JSON 格式,并且经过 Base64URL 编码。一个典型的头部示例是:
{
  "alg": "HS256",
  "typ": "JWT"
}
将此 JSON 进行 Base64 编码,形成 JWT 的第一部分。
ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9

Payload(载荷)#

Payload(载荷)是 JWT 中的第二部分,它包含了声明(Claims),这些 Claims 是关于实体(通常是用户信息)和其他数据的语句。根据 JWT 规范(RFC 7519),这些 Claims 分为三种类型:
1. Registered Claims(注册声明):这些是预定义的声明,虽然不是必须的,但是强烈推荐使用,以保证兼容性和互操作性。一些常见的注册声明包括:
iss(Issuer):令牌的发行者。
sub(Subject):令牌的主题,通常是令牌所代表的用户或实体。
aud(Audience):令牌的接收者,表示哪些实体可以使用该令牌。
exp(Expiration Time):令牌的过期时间,表示令牌在何时之后不再有效。
nbf(Not Before):令牌生效时间,在此时间之前令牌不可用。通常与 exp 一起使用,用于定义一个令牌的有效期。
iat(Issued At):令牌的签发时间,表示令牌何时被创建。
jti(JWT ID):表示 JWT 的唯一标识符。可以用于防止 JWT 重放攻击,每个 JWT 都有一个唯一的 ID。
2. Public Claims(公共声明):这些声明是可以自由定义的,但为了避免与其他声明冲突,最好是使用 URI 形式来定义。公共声明的使用可以根据应用程序的需求来定义各种自定义的声明,例如用户角色、权限等。
3. Private Claims(私有声明):这些是发送方和接收方共享的自定义声明,用于在双方之间传递特定于应用程序的信息。私有声明不受 JWT 规范的限制,可以根据应用程序的需求自由定义。
下面是一个示例 Payload(载荷),包含了注册声明和自定义声明:
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022,
  "exp": 1516242622
}
在这个示例中,sub 是主题(Subject),name 是自定义的公共声明,admin 表示用户是否为管理员,iat 表示令牌的签发时间,exp 表示令牌的过期时间。将其进行 Base64 编码,得到 Jwt 的第二部分:
ewogICJzdWIiOiAiMTIzNDU2Nzg5MCIsCiAgIm5hbWUiOiAiSm9obiBEb2UiLAogICJhZG1pbiI6IHRydWUsCiAgImlhdCI6IDE1MTYyMzkwMjIsCiAgImV4cCI6IDE1MTYyNDI2MjJ9

Signature(签名)#

Signature(签名)是 JWT 中的第三部分,它用于验证令牌的完整性。签名由头部(Header)、载荷(Payload)和密钥共同计算而来,确保令牌在传输过程中不被篡改。
根据 JWT 规范(RFC 7519),签名的计算流程如下:
1.
将头部和载荷分别进行 Base64 编码。
2.
使用指定的算法(在头部中指定)对编码后的头部和载荷以及密钥进行签名计算。
3.
将签名结果加入到 JWT 中,形成完整的 JWT 令牌。
由于签名使用了密钥进行计算,因此只有拥有正确密钥的接收方才能够验证签名的有效性。
下面是一个示例,演示了如何对给定的头部和负载数据进行签名计算。假设我们有以下头部和负载数据:
Header: {"alg": "HS256", "typ": "JWT"}
Payload: {"sub": "1234567890", "name": "John Doe", "admin": true, "iat": 1516239022, "exp": 1516242622}
假设我们使用 HMAC SHA-256 算法进行签名计算,并且密钥为 "secret"。
1.
将头部和负载数据进行 Base64 编码:
Encoded Header: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Encoded Payload: ewogICJzdWIiOiAiMTIzNDU2Nzg5MCIsCiAgIm5hbWUiOiAiSm9obiBEb2UiLAogICJhZG1pbiI6IHRydWUsCiAgImlhdCI6IDE1MTYyMzkwMjIsCiAgImV4cCI6IDE1MTYyNDI2MjJ9
2.
将编码后的头部和负载数据以及密钥传入 HMAC SHA-256 算法进行签名计算。假设计算得到的签名为:
ZjQ2NzI4ZTcwYjM3MzQyMTA5OWEzYjZmY2JmYTJhYWJmOWIyMjQ5MzgxYjVkM2ZkOWI1ZjFmZDgyNDA2ZjY4MQ==
3.
将签名结果加入到 JWT 中,形成完整的 JWT 令牌:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ewogICJzdWIiOiAiMTIzNDU2Nzg5MCIsCiAgIm5hbWUiOiAiSm9obiBEb2UiLAogICJhZG1pbiI6IHRydWUsCiAgImlhdCI6IDE1MTYyMzkwMjIsCiAgImV4cCI6IDE1MTYyNDI2MjJ9.ZjQ2NzI4ZTcwYjM3MzQyMTA5OWEzYjZmY2JmYTJhYWJmOWIyMjQ5MzgxYjVkM2ZkOWI1ZjFmZDgyNDA2ZjY4MQ==
这就是一个完整的 JWT 令牌,其中包含了头部、负载和签名三个部分。

JWT 的认证流程#

JWT 的使用通常涉及三个步骤:当用户通过用户名和密码完成验证后,服务器将生成一个 JWT,并发送回客户端。客户端(通常是浏览器)将 JWT 存储在本地,并随每个请求一起发送到服务器。服务器通过查看签名来验证 JWT 的真实性,并提取 Payload 中的数据,完成用户的验证或其他任务。

客户端如何使用 JWT ?#

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。此后,客户端每次与服务器通信,都要带上这个 JWT(通俗的讲叫 Token 凭证)。在发送请求时,可将其携带在请求头(Header)的 Authorization 字段中,下面的示例简单地演示了如何使用 Axios 发送登录请求以获取 JWT,然后使用这个 JWT 发送另一个请求。
修改于 2024-12-24 08:57:54
上一页
什么是 Bearer Token
下一页
什么是 Basic Auth
Built with