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 生成与分配
- 登录 API 管理后台,进入「API Key 管理」模块。
- 点击「生成新 Key」,选择关联的应用名称和权限范围(如:只读/读写)。
- 系统返回 Key 和 Secret(Secret 仅展示一次,需安全保存)。
- 将 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 核心流程
- 用户授权:第三方应用将用户重定向到授权服务器,用户确认授权。
- 授权码返回:授权服务器通过回调 URL 返回一次性授权码。
- 令牌交换:第三方应用用授权码 + Client Secret 向令牌端点换取 Access Token。
- 访问资源:第三方应用使用 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 图展示了在不同场景下如何选择最合适的认证机制:
3.6 认证机制组合架构
在实际生产环境中,图谱评分接口通常同时支持多种认证机制。以下架构图展示了 API 网关如何根据请求来源路由到不同的认证处理器:
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错误格式?