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
相关产品推荐
相关产品推荐

