基于Azure OAuth2登录的客户端应用如何实现嵌套安全API调用?
Azure嵌套API调用的令牌解决方案
一、代表登录用户实现嵌套API调用(OBO流程)
这是最贴合你需求的方案,允许第一个API以登录用户的身份,向Azure AD请求访问第二个API的令牌。
配置步骤:
- 为第一个API配置权限:在第一个API的应用注册中,添加对第二个API的委托权限,并获取管理员同意。注意权限类型必须是委托权限(关联用户上下文),而非应用权限。
- 实现OBO令牌请求逻辑:
- 第一个API从请求头中提取客户端应用发来的用户访问令牌;
- 用该令牌向Azure AD令牌端点发送请求,申请第二个API的访问令牌。伪代码示例:
token_endpoint = "https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token" payload = { "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer", "client_id": "第一个API的应用ID", "client_secret": "第一个API的客户端密钥", "assertion": "从请求头获取的用户访问令牌", "scope": "第二个API的作用域(如api://{第二个API应用ID}/.default)", "requested_token_use": "on_behalf_of" } # 发送POST请求获取新令牌
- 使用新令牌调用第二个API:把拿到的第二个API访问令牌放入请求头,发起调用即可。
适用场景:
- 需要保留用户上下文(比如第二个API要基于用户身份做权限校验、数据过滤);
- 所有API操作都需要关联到具体登录用户。
二、以API自身身份调用(应用权限)
如果嵌套API调用不需要用户上下文,仅需服务级交互,可以用这种方式。
配置步骤:
- 为第一个API配置应用权限:在第一个API的应用注册中,添加对第二个API的应用权限,并获取管理员同意。
- 实现客户端凭据流请求令牌:
- 第一个API使用自身的客户端ID和密钥(或证书),向Azure AD请求第二个API的访问令牌。伪代码示例:
token_endpoint = "https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token" payload = { "grant_type": "client_credentials", "client_id": "第一个API的应用ID", "client_secret": "第一个API的客户端密钥", "scope": "第二个API的作用域(如api://{第二个API应用ID}/.default)" } # 发送POST请求获取令牌
- 第一个API使用自身的客户端ID和密钥(或证书),向Azure AD请求第二个API的访问令牌。伪代码示例:
- 调用第二个API:用拿到的应用级令牌发起调用即可。
适用场景:
- 操作不依赖用户身份(比如后台数据同步、系统级查询);
- 第一个API需要独立于用户执行某些操作。
总结
如果需要保留用户上下文,优先用OBO流程实现代表用户的嵌套调用;如果不需要用户身份,用客户端凭据流以API自身身份调用即可。
内容的提问来源于stack exchange,提问作者traceurSaimn
相关产品推荐
相关产品推荐

