4. Bearer Token 认证:从概念到 OpenAPI 定义

Bearer Token 是当前 RESTful API 中最主流的认证方式之一。它通过在 HTTP 请求头中携带一个“令牌”(Token),让服务端验证请求者的身份。本章将深入剖析 Bearer Token 的核心概念、两种主流 Token 类型的差异,以及如何在 OpenAPI 规范中精确地定义 Bearer 认证方案。

4.1 Bearer Token 的核心概念

Bearer Token 是一种不记名令牌。任何持有该令牌的客户端(Bearer)都可以直接访问受保护的资源,无需额外提供身份证明。其核心流程如下:

  1. 客户端获取 Token:通过登录、OAuth2 授权码流程等方式,从认证服务器获取一个 Token。
  2. 客户端发送请求:在 HTTP 请求头中添加 Authorization: Bearer <token>。
  3. 服务端验证 Token:解析并验证 Token 的有效性、签名和权限。
  4. 返回资源或拒绝:验证通过则返回数据,否则返回 401 Unauthorized。
关键原则:Bearer Token 的安全性完全依赖于传输层(HTTPS)和 Token 本身的保密性。一旦泄露,攻击者即可冒充合法用户。
Bearer Token 认证流程 客户端 认证服务器 资源服务器 ① 登录/授权 ② 返回 Bearer Token ③ Authorization: Bearer <token> ④ 返回受保护资源 核心安全约束 Token 必须通过 HTTPS 传输,服务端必须验证 Token 签名和有效期

4.2 JWT 与 Opaque Token 的区别

Bearer Token 的实现主要分为两大类:JWT(JSON Web Token)和Opaque Token(不透明令牌)。两者在结构、验证方式和适用场景上有显著差异。

对比维度 JWT Opaque Token
结构 自包含的三段式:Header.Payload.Signature 随机字符串,无内部结构
验证方式 服务端本地验证签名,无需查库 服务端必须查询存储(Redis/DB)验证
携带信息 可包含用户 ID、角色、权限等声明 仅作为引用,信息需额外查询
性能 高(无 I/O 开销) 低(每次验证需 I/O 查询)
安全性 需防范签名算法攻击、密钥泄露 可即时撤销,泄露后风险可控
撤销能力 难(需维护黑名单或缩短有效期) 易(直接删除存储记录)
典型场景 分布式系统、无状态 API、微服务 单体应用、高安全要求、需即时撤销
选型建议:如果你的 API 需要无状态、高性能且能容忍 Token 有效期内的不可撤销性,选择 JWT。如果对安全撤销有强需求(如金融、支付场景),Opaque Token 更合适。
JWT 与 Opaque Token 结构对比 JWT(自包含令牌) Header 算法 + 类型 Payload 用户声明 Signature 防篡改签名 Opaque Token(不透明令牌) 随机字符串 无内部结构,仅作为引用 验证路径差异 JWT:客户端 → 资源服务器(本地验证签名)→ 返回数据 Opaque:客户端 → 资源服务器 → 认证服务器(查询存储)→ 返回数据 Opaque 每次验证多一次网络 I/O,但支持即时撤销

4.3 在 OpenAPI 中定义 Bearer 认证

OpenAPI 3.x 使用 securitySchemes 组件来声明认证方案。Bearer Token 认证属于 http 类型,scheme 为 bearer。以下是完整的定义方式:

4.3.1 基础定义

openapi: 3.0.3
info:
  title: 用户管理 API
  version: 1.0.0
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT  # 可选,说明 Token 格式
security:
  - BearerAuth: []

4.3.2 字段详解

字段 必填 说明 示例值
type 是 认证类型,Bearer 固定为 http http
scheme 是 HTTP 认证方案,Bearer 固定为 bearer bearer
bearerFormat 否 Token 格式提示,用于文档生成 JWT 或 Opaque
description 否 认证方案的详细说明 请输入您的 Bearer Token

4.3.3 全局与局部安全要求

安全要求可以定义在全局(security 顶层字段)或局部(每个操作级别)。局部定义会覆盖全局定义。

# 全局安全要求:所有接口默认需要 Bearer Token
security:
  - BearerAuth: []

# 局部覆盖:某个接口不需要认证
paths:
  /public/health:
    get:
      security: []  # 空数组表示无认证要求
      responses:
        '200':
          description: 健康检查通过

# 局部覆盖:某个接口需要额外权限
  /admin/users:
    get:
      security:
        - BearerAuth: ['admin']  # 需要 admin 作用域
      responses:
        '200':
          description: 用户列表
常见错误:security 字段的值是一个数组,即使只有一个认证方案,也必须写成 - BearerAuth: [] 的格式。遗漏方括号或写成 BearerAuth: 会导致规范解析失败。

4.3.4 完整示例:带 Bearer 认证的 API 定义

openapi: 3.0.3
info:
  title: 订单服务 API
  version: 2.0.0
  description: 使用 JWT Bearer Token 进行认证
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: |
        通过登录接口获取 JWT Token。
        格式:Authorization: Bearer <token>
  schemas:
    Order:
      type: object
      properties:
        id:
          type: integer
        product:
          type: string
        amount:
          type: number
security:
  - BearerAuth: []
paths:
  /orders:
    get:
      summary: 获取订单列表
      responses:
        '200':
          description: 成功返回订单列表
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Order'
        '401':
          description: 未提供或 Token 无效
    post:
      summary: 创建订单
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Order'
      responses:
        '201':
          description: 订单创建成功
        '401':
          description: 认证失败

4.4 最佳实践与避坑指南

  • 始终使用 HTTPS:Bearer Token 在 HTTP 头中明文传输,HTTPS 是唯一的安全保障。
  • 设置合理的 Token 有效期:JWT 建议 15-60 分钟,Opaque Token 可根据业务需求灵活设置。
  • 使用 Refresh Token 机制:避免频繁要求用户重新登录,同时降低长期 Token 泄露的风险。
  • 在 OpenAPI 中明确描述 Token 获取方式:在 description 字段中说明登录接口和 Token 格式,降低客户端集成难度。
  • 区分认证与授权:Bearer Token 只解决“你是谁”的问题,权限控制(“你能做什么”)需要额外的作用域(scopes)或 RBAC 机制。
总结:Bearer Token 认证是 OpenAPI 生态中最基础也最灵活的认证方式。理解 JWT 与 Opaque Token 的差异,并在 OpenAPI 规范中精确声明 type: http、scheme: bearer,是构建安全、可维护 API 的第一步。