Android Java应用使用MS Graph API 6.12时如何获取authorizationCode?
1. 配置Azure AD应用
- 登录Azure门户,在应用注册中创建/使用目标Android应用,确保:
- 重定向URI设置为
msal{CLIENT_ID}://auth(需与代码中REDIRECT_URL完全一致) - 启用授权码流,并添加“移动和桌面应用”平台
- 为应用授予
Files.Read.All等OneDrive相关权限,按需勾选“管理员同意”
- 重定向URI设置为
2. 通过MSAL Android库发起授权请求
Android属于公共客户端,需借助MSAL库完成用户授权并获取授权码:
- 先在项目
build.gradle中添加MSAL依赖:dependencies { implementation 'com.microsoft.identity.client:msal:4.14.0' } - 初始化MSAL客户端并发起授权:
// 初始化PublicClientApplication PublicClientApplication pca = new PublicClientApplication.Builder(context) .clientId(CLIENT_ID) .authority("https://login.microsoftonline.com/" + TENANT_ID) .build(); // 定义需要的权限,offline_access用于获取刷新令牌 List<String> scopes = Arrays.asList("Files.Read.All", "offline_access"); // 发起授权请求 pca.acquireToken(getActivity(), scopes, new AuthenticationCallback() { @Override public void onSuccess(IAuthenticationResult authenticationResult) { // 此处获取到的就是所需的authorizationCode String authorizationCode = authenticationResult.getAuthorizationCode(); // 传入AuthorizationCodeCredentialBuilder使用 initGraphCredential(authorizationCode); } @Override public void onError(MsalException exception) { // 处理授权失败逻辑 } @Override public void onCancel() { // 用户取消授权逻辑 } });
3. 关键注意事项
- Android是公共客户端,禁止在代码中硬编码clientSecret,需移除
AuthorizationCodeCredentialBuilder中的.clientSecret(CLIENT_SECRET_VALUE)参数,修正后的代码:final AuthorizationCodeCredential credential = new AuthorizationCodeCredentialBuilder() .clientId(CLIENT_ID) .tenantId(TENANT_ID) .authorizationCode(authorizationCode) .redirectUrl(REDIRECT_URL) .build(); - 授权码为一次性有效,使用后会失效,需重新发起授权获取新的code
- 确保Azure应用注册的重定向URI与代码中
REDIRECT_URL完全匹配,否则授权会失败
内容的提问来源于stack exchange,提问作者GGK stands for Ukraine
相关产品推荐
相关产品推荐

