基于Azure AD B2C的Android应用安全访问非Graph API问题
我来帮你排查这个头疼的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
相关产品推荐
相关产品推荐

