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

Azure AD中如何获取Access Token的aud声明客户端ID并生成OBO令牌?

问题解决:Azure AD OBO流程令牌生成失败及Aud声明异常

核心问题原因

你当前的授权码请求仅使用email openid offline_access这类OpenID Connect身份范围,并未指定针对客户端或目标API的资源范围,导致返回的Access Token的aud声明指向默认的Microsoft Graph服务,而非你的客户端ID或目标API的App ID URI,这直接导致OBO流程调用失败。

分步解决方案

1. 修正授权码请求的Scope

在授权码端点请求中,添加客户端自身的默认范围或目标API的默认范围,确保返回的Access Token的aud符合OBO断言要求:

示例1:请求客户端自身范围(Aud为客户端ID)

https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize?client_id=sample_client_id&response_type=code&redirect_uri=http://localhost/login/oauth2/code/azure&response_mode=query&scope=sample_client_id/.default email openid offline_access

其中sample_client_id/.default表示请求客户端应用的默认委派权限,生成的Access Token的aud会是你的客户端ID。

示例2:直接请求目标API范围(Aud为API的App ID URI)

https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize?client_id=sample_client_id&response_type=code&redirect_uri=http://localhost/login/oauth2/code/azure&response_mode=query&scope={app-id-uri}/.default email openid offline_access

这里{app-id-uri}替换为你Web API的App ID URI,生成的Access Token的aud会是该API的标识。

2. 验证Access Token的Aud声明

拿到新的Access Token后,可通过jwt.ms解析确认aud字段是否为预期的客户端ID或API的App ID URI。

3. 确保OBO流程的配置正确性

  • 确认Web客户端应用已被Web API授予委派权限:在Azure AD的API应用“权限”面板中添加客户端应用的权限,并完成管理员同意。
  • 确认API应用的应用清单中knownClientApplications字段已添加客户端应用的ID。
  • 确保MSAL代码中的authority为单租户模式的正确地址:https://login.microsoftonline.com/{tenant-id}/v2.0

修正后的MSAL Java代码

ConfidentialClientApplication clientApp = ConfidentialClientApplication
        .builder(clientId, ClientCredentialFactory.createFromSecret(clientSecret))
        .authority("https://login.microsoftonline.com/{tenant-id}/v2.0")
        .build();

Set<String> scopes = new HashSet<>();
// 替换为你的Web API的App ID URI
scopes.add(appIdUri + "/.default");
UserAssertion assertion = new UserAssertion(accessToken);
OnBehalfOfParameters params = OnBehalfOfParameters.builder(scopes, assertion).build();      
CompletableFuture<IAuthenticationResult> result = clientApp.acquireToken(params);
String userInfoAccessToken = result.get().accessToken();

常见错误排查

  • 若OBO请求返回invalid_grant/invalid_request:检查断言Token的aud是否正确,客户端是否已获得API的权限,以及scope参数是否符合要求。
  • 若Token的aud仍不符合预期:确认授权码请求的scope中是否包含了正确的资源标识符(客户端ID或API的App ID URI)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:00:58