3. 接口认证机制:API Key、OAuth 2.0、JWT令牌的配置与使用

图谱评分接口作为核心业务数据通道,必须建立可靠的认证防线。本章聚焦三种主流认证机制:API Key(轻量级身份标识)、OAuth 2.0(授权委托框架)和 JWT(自包含令牌)。你将掌握每种机制的适用场景、配置步骤及在API网关中的集成方式。

3.1 三种认证机制对比

特性 API Key OAuth 2.0 JWT
认证粒度 应用级 用户级 + 权限范围 用户级 + 自定义声明
状态管理 无状态(Key本身) 有状态(授权码/令牌) 无状态(自包含)
令牌生命周期 长期有效(可轮换) 短期 + 刷新令牌 短期(可配置过期时间)
适用场景 内部服务、第三方简单集成 第三方应用授权、开放平台 分布式系统、微服务间认证
安全等级 中(需配合IP白名单) 高(支持多因子) 高(签名防篡改)

3.2 API Key 配置与使用

API Key 是最简单的认证方式,适合内部服务或受信任的第三方调用。图谱评分接口推荐将 API Key 放在 HTTP 请求头中传递,而非 URL 参数。

3.2.1 生成与分配

  1. 登录 API 管理后台,进入「API Key 管理」模块。
  2. 点击「生成新 Key」,选择关联的应用名称和权限范围(如:只读/读写)。
  3. 系统返回 Key 和 Secret(Secret 仅展示一次,需安全保存)。
  4. 将 Key 分配给调用方,并记录调用方身份信息用于审计。

3.2.2 请求示例

# 请求头方式(推荐)
GET /v1/graph/score HTTP/1.1
Host: api.example.com
X-API-Key: sk_live_4f8a2b1c9d3e7f0a
Content-Type: application/json

# URL 参数方式(不推荐,日志可能泄露 Key)
GET /v1/graph/score?api_key=sk_live_4f8a2b1c9d3e7f0a HTTP/1.1

3.2.3 网关校验配置

# Kong API Gateway 配置示例
services:
  - name: graph-score-service
    routes:
      - name: graph-score-route
        paths:
          - /v1/graph
    plugins:
      - name: key-auth
        config:
          key_names:
            - X-API-Key
          hide_credentials: true
          anonymous: null
安全提醒:API Key 应定期轮换(建议每 90 天)。不要在客户端代码中硬编码 Key,应使用环境变量或密钥管理服务(如 AWS Secrets Manager、HashiCorp Vault)。

3.3 OAuth 2.0 授权码流程

当图谱评分接口需要代表用户访问数据时(如第三方应用查询用户的历史评分),OAuth 2.0 的授权码模式是最佳选择。它确保用户凭证不会直接暴露给第三方应用。

3.3.1 核心流程

  1. 用户授权:第三方应用将用户重定向到授权服务器,用户确认授权。
  2. 授权码返回:授权服务器通过回调 URL 返回一次性授权码。
  3. 令牌交换:第三方应用用授权码 + Client Secret 向令牌端点换取 Access Token。
  4. 访问资源:第三方应用使用 Access Token 调用图谱评分接口。
关键配置项:
  • redirect_uri:必须与注册时完全一致,防止开放重定向攻击。
  • scope:定义权限范围,如 graph:read、graph:write。
  • state 参数:防止 CSRF 攻击,建议使用随机字符串。

3.3.2 令牌请求示例

POST /oauth/token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=AUTH_CODE_XYZ123
&redirect_uri=https://third-party.app/callback
&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET

3.3.3 响应示例

{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "def50200a1b2c3d4e5f6...",
  "scope": "graph:read"
}

3.4 JWT 令牌的配置与验证

JWT(JSON Web Token)是一种自包含的令牌格式,包含用户身份、权限声明和签名信息。图谱评分接口在微服务架构中优先使用 JWT,避免每次请求都查询认证中心。

3.4.1 JWT 结构

部分 内容 示例
Header 令牌类型和签名算法 {"alg":"RS256","typ":"JWT"}
Payload 声明(Claims),包含用户信息和权限 {"sub":"user_123","role":"admin","iat":1710000000}
Signature 对 Header 和 Payload 的签名 使用私钥生成的签名值

3.4.2 生成 JWT(服务端)

// Node.js 示例(使用 jsonwebtoken 库)
const jwt = require('jsonwebtoken');
const privateKey = fs.readFileSync('private.pem');

const payload = {
  sub: 'user_456',
  role: 'analyst',
  permissions: ['graph:read', 'graph:write'],
  iat: Math.floor(Date.now() / 1000),
  exp: Math.floor(Date.now() / 1000) + 3600  // 1小时过期
};

const token = jwt.sign(payload, privateKey, { algorithm: 'RS256' });
console.log('JWT:', token);

3.4.3 验证 JWT(API 网关)

// Kong 网关 JWT 插件配置
plugins:
  - name: jwt
    config:
      uri_param_names:
        - jwt
      claims_to_verify:
        - exp
        - nbf
      key_claim_name: iss
      secret_is_base64: false
      run_on_preflight: true

// 网关验证逻辑伪代码
function verifyJWT(token) {
  const publicKey = getPublicKeyFromJWKS();
  try {
    const decoded = jwt.verify(token, publicKey, {
      algorithms: ['RS256'],
      issuer: 'https://auth.example.com'
    });
    return decoded;  // 包含用户信息和权限
  } catch (err) {
    throw new Error('Invalid or expired token');
  }
}
最佳实践:
  • 使用 RS256(非对称算法)而非 HS256,私钥仅认证服务器持有,网关用公钥验证。
  • 设置合理的 exp(过期时间),图谱评分接口建议 15-30 分钟。
  • 通过 JWKS(JSON Web Key Set)端点动态获取公钥,支持密钥轮换。

3.5 认证机制选择决策树

以下 SVG 图展示了在不同场景下如何选择最合适的认证机制:

认证机制选择决策树 调用方是谁? 内部微服务 / 可信后端 API Key + IP 白名单 或 JWT(服务间认证) 第三方应用 / 开放平台 OAuth 2.0 授权码模式 + JWT 作为 Access Token SPA / 移动端 / 客户端 OAuth 2.0 PKCE 流程 + JWT 短期令牌 决策要点: • 内部服务:优先 API Key(简单)或 JWT(需传递用户上下文) • 第三方应用:必须 OAuth 2.0,避免泄露用户密码 • 前端应用:使用 PKCE 增强安全,禁止在客户端存储 Client Secret 推荐组合:API Key(内部)+ OAuth 2.0(外部)+ JWT(令牌格式)

3.6 认证机制组合架构

在实际生产环境中,图谱评分接口通常同时支持多种认证机制。以下架构图展示了 API 网关如何根据请求来源路由到不同的认证处理器:

多认证机制网关架构 内部服务 API Key 第三方应用 OAuth 2.0 + JWT 前端应用 PKCE + JWT API 网关 认证路由器 Key / JWT / OAuth 插件 认证服务 验证 / 签发令牌 图谱评分服务 接收已验证的请求 架构要点: • 网关统一处理认证,后端服务无需关心令牌格式 • 认证服务负责签发和验证 JWT,支持密钥轮换

3.7 常见问题与避坑指南

高频错误:
  • API Key 泄露:将 Key 硬编码在客户端代码或公开仓库中。应使用环境变量或密钥管理服务。
  • JWT 未验证签名:仅解码 Payload 而不验证 Signature,导致令牌伪造。务必使用公钥验证。
  • OAuth 2.0 缺少 state 参数:容易遭受 CSRF 攻击。每次授权请求都应生成随机 state 值。
  • 令牌过期处理不当:客户端未实现刷新令牌逻辑,导致频繁 401 错误。建议使用拦截器自动刷新。
生产环境检查清单:
  • 所有 API 端点是否强制要求认证(除健康检查等公开端点外)?
  • API Key 是否支持按 IP 或 Referer 限制?
  • JWT 的 exp 和 nbf 是否在网关层验证?
  • OAuth 2.0 的授权码是否一次性使用?
  • 认证失败时是否返回统一的 401 / 403 错误格式?

3.8 本章小结