You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

on_behalf_of流程中client_assertion与assertion生成方法?证书获取AccessToken指引

基于证书获取Access Token的指引与示例

当你用证书方式获取Access Token时,不需要额外获取其他令牌,核心是用你的应用证书生成一个签名的JWT,这个JWT就是你困惑的assertion或client_assertion参数,具体对应哪个参数取决于你使用的授权模式。

核心概念

  • client_assertion:用于客户端凭证模式(Client Credentials Grant),配合client_assertion_type参数使用。
  • assertion:用于JWT Bearer授权模式(比如服务间 impersonation 场景)。
  • 两者本质都是用你的应用私钥签名生成的JWT,身份提供商(IDP)通过对应的公钥验证签名有效性,从而信任你的应用身份。

JWT的结构与生成

JWT由Header、Payload、Signature三部分组成,需用你的应用私钥签名。

1. JWT Header示例

{
  "alg": "RS256", // 必须与证书算法匹配,如RS256/ES256
  "kid": "你的证书密钥ID(若在IDP注册时指定)",
  "typ": "JWT"
}

2. JWT Payload示例(以Azure AD为例,不同IDP字段略有差异)

{
  "aud": "https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token", // IDP的令牌端点URL
  "exp": 1718978400, // 过期时间戳(当前时间+30分钟内,不能过长)
  "iss": "你的client_id", // 签发者,即应用ID
  "sub": "你的client_id", // 主体,通常与iss一致
  "iat": 1718976600 // 签发时间戳
}

3. 命令行生成JWT示例(用openssl)

# 编码Header为Base64URL格式
header=$(echo '{"alg":"RS256","typ":"JWT"}' | base64 | tr '+/' '-_' | tr -d '=\n')

# 编码Payload(替换为你的实际参数)
payload=$(echo '{"aud":"https://login.microsoftonline.com/your-tenant-id/oauth2/v2.0/token","exp":'$(date -d "+30 minutes" +%s)',"iss":"your-client-id","sub":"your-client-id","iat":'$(date +%s)'}' | base64 | tr '+/' '-_' | tr -d '=\n')

# 拼接未签名的令牌部分
unsigned_token="$header.$payload"

# 用私钥签名生成Signature(替换为你的私钥文件路径)
signature=$(echo -n "$unsigned_token" | openssl dgst -sha256 -sign your-private-key.pem | base64 | tr '+/' '-_' | tr -d '=\n')

# 最终生成的JWT
jwt="$header.$payload.$signature"

发送请求获取Access Token示例

场景1:客户端凭证模式(Client Credentials Grant)

curl -X POST "https://login.microsoftonline.com/your-tenant-id/oauth2/v2.0/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=your-client-id" \
  -d "grant_type=client_credentials" \
  -d "scope=your-required-scope" \
  -d "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer" \
  -d "client_assertion=$jwt"

场景2:JWT Bearer授权模式

curl -X POST "https://login.microsoftonline.com/your-tenant-id/oauth2/v2.0/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=your-client-id" \
  -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
  -d "scope=your-required-scope" \
  -d "assertion=$jwt"

关键注意事项

  • 你的应用必须在身份提供商(如Azure AD、Okta)后台注册,并上传证书的公钥,IDP才能验证JWT签名。
  • aud字段必须严格匹配IDP的令牌端点URL,否则会验证失败。
  • exp过期时间需设置为当前时间后10-30分钟,不能超过IDP的限制(如Azure AD默认最大1小时)。
  • 签名算法alg必须与上传的公钥算法一致(RSA证书用RS256,EC证书用ES256)。

内容的提问来源于stack exchange,提问作者user000682

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:40:59