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

基于Azure AD B2C的Android应用安全访问非Graph API问题

解决Android应用用MSAL AccessToken访问自定义API时的401 Unauthorized问题

我来帮你排查这个头疼的401问题,毕竟之前处理过不少类似的场景,咱们一步步来:

1. 先确认请求的Scope是否正确

你能正常调用Microsoft Graph,说明你的MSAL登录流程没问题,但Graph有它专属的scope(比如User.Read),而你的自定义API需要使用自己注册的scope。你需要:

  • 登录Azure门户,找到你的自定义API注册,在“公开API”页面查看它的应用ID URI(比如api://xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)和定义的scope(比如access_as_user)。
  • 在Android应用的登录请求中,把自定义API的完整scope加进去,比如api://<你的API应用ID>/access_as_user,而不是只用Graph的scope。

2. 解析AccessToken检查受众(Audience)

拿你获取到的accessToken去解析(可以用jwt.ms工具),重点看aud字段:

  • 如果aud的值是Graph的客户端ID(00000003-0000-0000-c000-000000000000),那说明你请求的是Graph的token,自然无法访问自定义API。
  • 正确的aud应该是你自定义API的应用ID或者应用ID URI,这样API才会认可这个token。

3. 验证自定义API的身份验证配置

你的API这边需要正确配置token验证逻辑:

  • 确保验证token的issuer和你的Azure AD租户匹配(比如https://login.microsoftonline.com/<租户ID>/v2.0)。
  • 确认API允许你的Android应用的客户端ID访问——在Azure门户的API注册里,“API权限”页面要添加你的Android应用作为授权的客户端应用,并且授予对应的权限。

4. 检查MSAL的请求代码示例

给你一个Android应用请求自定义API token的简单示例,参考调整你的代码:

// 定义自定义API的scope
List<String> customApiScopes = Arrays.asList("api://<你的API应用ID>/access_as_user");

// 初始化MSAL单账户应用
PublicClientApplication.createSingleAccountPublicClientApplication(
    getApplicationContext(),
    R.raw.auth_config,
    new IPublicClientApplication.ISingleAccountApplicationCreatedListener() {
        @Override
        public void onCreated(ISingleAccountPublicClientApplication app) {
            // 发起登录请求,带上自定义API的scope
            app.signIn(
                null,
                null,
                customApiScopes,
                new AuthenticationCallback() {
                    @Override
                    public void onSuccess(IAuthenticationResult result) {
                        // 获取到的token就可以用来访问自定义API了
                        String accessToken = result.getAccessToken();
                        // 调用你的API,在请求头里加Authorization: Bearer <accessToken>
                    }

                    @Override
                    public void onError(MsalException exception) {
                        // 处理错误
                    }

                    @Override
                    public void onCancel() {
                        // 处理取消
                    }
                }
            );
        }

        @Override
        public void onError(MsalException exception) {
            // 初始化错误处理
        }
    }
);

5. Postman测试的注意事项

你说Postman也报错,要确认:

  • 请求头里的Authorization字段格式是Bearer <你的AccessToken>,没有拼写错误。
  • 你在Postman里获取token时,用的是和Android应用相同的客户端ID、租户ID,并且请求的scope包含自定义API的scope,而不是Graph的scope。

如果以上步骤都检查过还是有问题,可以再看看API的日志,通常401会有更详细的错误信息(比如token过期、签名无效、权限不足等),能帮你更快定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:43:14