3. AI应用认证机制工程

AI应用的身份认证与普通Web应用有一个关键差异:调用链往往由“人—应用—模型服务—工具/数据源”多段组成,既有用户身份,也有工作负载身份。把API密钥、OAuth 2.0、OIDC、JWT、mTLS混用或误用,是AI系统最常见的权限事故来源。本节先厘清五种机制在AI调用链中的位置,再给出选型、配置与风险控制方法。

一、五种机制的本质区别

API密钥是一段长期有效的共享秘密,服务端只校验“密钥是否正确”,不携带调用者身份语义。它适合服务端到服务端的低敏感调用,但一旦泄露即等同于身份被冒用,且难以细粒度撤销。

OAuth 2.0是授权框架,解决“应用如何获得访问资源的权限”,核心产物是access token。它不规定用户身份如何表达,只规定授权流程(如授权码、客户端凭证)。在AI场景中,常用于让AI应用代表用户访问第三方数据源。

OIDC构建在OAuth 2.0之上,增加身份层,核心产物是ID Token(一个JWT),用于回答“用户是谁”。AI应用需要确认“当前对话属于哪个用户”时,应使用OIDC而非裸OAuth。

JWT是一种令牌格式,不是认证协议。它可以承载OIDC的ID Token,也可以承载OAuth的access token。JWT的价值在于自包含声明(iss、sub、aud、exp、scope),风险在于签名校验缺失、算法混淆(alg=none或HS/RS混用)和过期时间过长。

mTLS是双向TLS,客户端与服务端互相验证证书,提供强工作负载身份。它适合模型服务网格内部、Agent与工具服务之间的调用,能防止未授权工作负载接入,但不表达用户级权限。

AI调用链中的认证机制分层 终端用户 浏览器 / 客户端 OIDC 身份层 ID Token (JWT) → sub OAuth 2.0 授权层 access token → scope AI 应用 / Agent 编排层 校验 JWT 签名 · 校验 aud/exp · 映射用户与工作负载身份 模型推理服务 mTLS 工作负载身份 工具 / 数据源 API Key 或 OAuth token 第三方 SaaS OAuth 2.0 授权码 风险控制要点: ① JWT 必须校验签名与 aud/exp,禁用 alg=none;② API Key 仅限服务端,禁止下发前端;③ mTLS 证书短周期轮换;④ OAuth token 最小 scope。 ⑤ 用户身份(OIDC sub)与工作负载身份(mTLS SPIFFE)分离,避免用同一凭证同时表达两者。

二、选型判断:按调用段选择机制

选型不应按“哪个更安全”排序,而应按调用段身份类型决定。下面给出一个可直接套用的判断表(示例参数,非实测):

调用段身份主体推荐机制关键校验
用户 → AI应用自然人OIDC + JWTiss、aud、exp、nonce、签名算法
AI应用 → 模型服务工作负载mTLS证书链、SPIFFE ID、吊销状态
AI应用 → 内部工具工作负载mTLS 或短期JWTaud 限定、scope 最小化
AI应用 → 第三方SaaS用户授权OAuth 2.0 授权码 + PKCEstate、code_verifier、scope
批处理 → 内部API服务API Key(受限)IP白名单、速率限制、轮换

三、配置要点与可执行示例

以OIDC + JWT校验为例,AI应用在收到ID Token后必须完成以下校验,缺一不可。下面是一段Node.js风格的校验逻辑示例(示例参数,非实测):

// 示例:OIDC ID Token 校验关键步骤
const jwksClient = require('jwks-rsa');
const jwt = require('jsonwebtoken');

const client = jwksClient({ jwksUri: 'https://idp.example.com/.well-known/jwks.json' });

function getKey(header, callback) {
  client.getSigningKey(header.kid, (err, key) => {
    callback(null, key.getPublicKey());
  });
}

jwt.verify(idToken, getKey, {
  algorithms: ['RS256'],          // 显式限定算法,防 alg 混淆
  audience: 'ai-app-client-id',   // 必须匹配本应用
  issuer: 'https://idp.example.com/',
  clockTolerance: 5               // 允许5秒时钟偏差
}, (err, decoded) => {
  if (err) throw new Error('token invalid: ' + err.message);
  // decoded.sub 即用户唯一标识,用于后续权限映射
});

mTLS配置的核心是证书签发与轮换。在服务网格中,通常由控制面为每个工作负载签发短周期证书(如24小时),SPIFFE ID形如 spiffe://cluster.local/ns/ai/sa/model-client。服务端校验时不仅要验证证书链,还要校验SPIFFE ID是否在允许列表内,避免“有证书即可访问”的误区。

常见配置错误:把API Key写进前端JavaScript或移动端包体;JWT校验时只解码不验签;OAuth回调未校验state导致CSRF;mTLS只验证书不验身份。这四类错误在AI应用中占比最高,应作为上线前必查项。

四、风险控制与凭证生命周期

认证机制的风险控制要覆盖“签发—使用—轮换—撤销”全周期。API Key应设置90天轮换、支持即时撤销、绑定IP或来源;OAuth token应使用短期access token(如1小时)配合refresh token,refresh token需绑定客户端并支持撤销;JWT应控制exp在5~15分钟,避免长期有效;mTLS证书应短周期自动轮换,并维护吊销列表。

工程建议:在AI网关层统一做认证收敛——外部请求统一走OIDC/OAuth,内部服务间统一走mTLS,API Key仅作为过渡或低敏感场景使用。这样可以把“认证逻辑”从每个AI应用中抽离,降低配置漂移风险。

最后需要强调:认证只解决“你是谁”,授权才解决“你能做什么”。在AI应用中,用户身份(OIDC sub)与工作负载身份(mTLS SPIFFE ID)应分别映射到权限模型,避免用同一个凭证同时表达两种身份。只有把认证机制与调用段、身份类型、生命周期管理对齐,AI服务的身份权限安全才具备可工程化的基础。