Java调用Microsoft Graph访问OneDrive报错AADSTS70000121问题咨询
问题根因
报错核心是兑换授权码环节未显式指定微软身份平台的/common鉴权端点。你使用的AuthorizationCodeCredential默认会指向仅支持工作/学校账户的/organizations鉴权端点,当你通过/common授权端点拿到个人微软账户(MSA,如outlook.com、live.com账号)返回的授权码时,用组织专属端点兑换令牌就会触发AADSTS70000121错误。
另外代码存在隐性配置问题:授权阶段申请的是委托类权限,兑换令牌时却使用了.default静态权限范围,个人账号场景下极易触发权限不匹配问题。
修复方案
- 构建
AuthorizationCodeCredential实例时,显式指定鉴权主机为https://login.microsoftonline.com/common,同时兼容个人微软账户、工作/学校账户两类身份。如果仅需要支持个人微软账户,也可以将鉴权地址替换为https://login.microsoftonline.com/consumers - 替换兑换令牌时传入的权限范围配置,移除
.default配置,和授权阶段申请的委托权限保持一致即可 - 前置检查:确认Azure AD应用注册时,已将支持的账户类型设置为「任何组织目录中的账户和个人Microsoft账户」,否则个人账号本身无法完成授权流程
修正后的核心代码
import java.util.Arrays; import java.util.List; // 权限配置与授权阶段保持一致,移除.default配置 List<String> scopes = Arrays.asList( "openid", "Files.Read", "Files.ReadWrite", "Contacts.Read", "offline_access" ); AuthorizationCodeCredential authCodeCredential = new AuthorizationCodeCredentialBuilder() .clientId(CLIENT_ID) .clientSecret(CLIENT_SECRET) .authorizationCode(authorizationCode) .redirectUrl(REDIRECT_URL) // 显式指定/common鉴权端点,支持个人微软账号 .authorityHost("https://login.microsoftonline.com/common") .build(); TokenCredentialAuthProvider tokenCredAuthProvider = new TokenCredentialAuthProvider(scopes, authCodeCredential); GraphServiceClient graphClient = GraphServiceClient.builder() .authenticationProvider(tokenCredAuthProvider) .buildClient(); User me = graphClient.me() .buildRequest() .get();
提示:个人微软账户的令牌兑换不支持
.default权限范围,必须明确传入实际需要的委托权限,否则会额外触发权限校验错误。
内容的提问来源于stack exchange,提问作者Tiberiu
相关产品推荐
相关产品推荐

