Android未检索Azure AD身份验证的正确访问令牌

xxls0lw8  于 2023-03-03  发布在  Android
关注(0)|答案(1)|浏览(220)

我正在开发一个Android应用程序,使用MSAL for Android。用户通过这个库验证自己以获得访问令牌,然后使用这个令牌通过Sharepoint API进行授权。
我有一个Azure AD注册设置,我们使用它来提供令牌。我们已经有了该应用的工作版本,用户可以通过刷新令牌对自己进行身份验证。使用标准的Microsoft身份验证流程(获取身份验证代码,使用代码调用API并保存刷新令牌)通过Web浏览器检索此refersh令牌。
我现在想使用MSAL执行相同的身份验证,而不是让用户手动获取刷新令牌。我已经有了一个工作配置,可以使用Microsoft帐户登录,但当我使用令牌调用Sharepoint API时,我们收到此错误:'
{"error_description":"Exception of type 'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException' was thrown."}
通过以下代码检索令牌:

private ISingleAccountPublicClientApplication mSingleAccountApp;
private final static String[] SCOPES = {"Sites.FullControl.All"};

PublicClientApplication.createSingleAccountPublicClientApplication(getApplicationContext(),
                R.raw.auth_config_single_account, new IPublicClientApplication.ISingleAccountApplicationCreatedListener() {
                    @Override
                    public void onCreated(ISingleAccountPublicClientApplication application) {
                        Log.d(Misc.LOGTAG, "OnCreated Called, set mSingleAccountApp");
                        mSingleAccountApp = application;
                        loadAccount();
                    }
                    @Override
                    public void onError(MsalException exception) {
                        displayError(exception);
                    }
                });

 btnLogin.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                if (mSingleAccountApp == null) {
                    Log.d(Misc.LOGTAG, "mSingleAccountApp == null");
                    return;
                }
                mSingleAccountApp.signIn(UploadActivity.this, null, SCOPES, getAuthInteractiveCallback());
                btnLogin.setVisibility(View.GONE);
                btnLogout.setVisibility(View.VISIBLE);
            }
        });

          btnLogout.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                if (mSingleAccountApp == null) {
                    Log.d(Misc.LOGTAG, "mSingleAccountApp == null");
                    btnLogin.setVisibility(View.VISIBLE);
                    btnLogout.setVisibility(View.GONE);
                    return;
                }
                mSingleAccountApp.signOut(getSignOutCallback());
            }
        });

private AuthenticationCallback getAuthInteractiveCallback() {
        return new AuthenticationCallback() {
            @Override
            public void onSuccess(IAuthenticationResult authenticationResult) {
                /* Successfully got a token, use it to call a protected resource - MSGraph */
                accessToken = authenticationResult.getAuthorizationHeader();
                Log.i("token", accessToken);
            }

            @Override
            public void onError(MsalException exception) {
                /* Failed to acquireToken */
                Log.d(Misc.LOGTAG, "Authentication failed: " + exception.toString());
                displayError(exception);
            }
            @Override
            public void onCancel() {
                /* User canceled the authentication */
                Log.d(Misc.LOGTAG, "User cancelled login.");
            }
        };
    }

    private ISingleAccountPublicClientApplication.SignOutCallback getSignOutCallback() {
        return new ISingleAccountPublicClientApplication.SignOutCallback() {
            @Override
            public void onSignOut() {
                btnLogin.setVisibility(View.VISIBLE);
                btnLogout.setVisibility(View.GONE);
            }

            @Override
            public void onError(@NonNull MsalException exception) {
                displayError(exception);
            }
        };
    }

检索到访问令牌后,我们使用它进行SharePoint API调用:

public interface SharePointService {

    @Headers({"Accept: application/json; odata=verbose"})
    @POST("/sites/{siteName}/_api/web/GetFolderByServerRelativeUrl('{url}')/files/add(overwrite=true,url='{file}')")
    Call<ResponseBody> CreateFile(@Header("Authorization") String authorization, @Path("siteName") String siteName, @Path("url") String url, @Path("file") String file, @Body RequestBody fileContent);
}

授权标头包含前缀为"Bearer"的令牌。
Azure AD应用注册配置了正确的作用域+Android应用的平台配置。大多数开发人员发现作用域设置不正确存在问题,但我没有发现Azure配置存在任何问题。

任何帮助都将不胜感激

u59ebvdq

u59ebvdq1#

我创建了具有以下权限/范围应用程序注册,

将范围指定为https://. www.example.com,并在postman中尝试该场景。sharepoint.com/.default and tried the scenario in postman.

收到错误:访问群体无效,即使在提供正确的作用域和API权限并授予管理员同意后也是如此。

    • 使用图形调用站点:**

一月一日

在这里调用graph api时,我们需要***https://graph.microsoft.com /.default***作为作用域,它在调用API时给出输出。对于那个调用令牌端点,使用https://graph.microsoft.com/. default作为作用域,然后使用graph作用域的访问令牌调用sharepoint api。

    • 但如果不使用grah api终结点调用站点终结点,则范围必须为***https://<tenantdomain>.sharepoint.com/.default*必须给定

调用sharepoint站点api的正确查询是

一米三米一x

我的验证码是:

https://login.microsoftonline.com/<tenantid>/oauth2/v2.0/authorize?client_id=782xxxb3a1&response_type=code&redirect_uri=https://jwt.ms&response_mode=query&scope=https://tenantdoamin.sharepoint.com/.default

代码,我得到如下,

令牌终结点:我用了我拿到的密码。

    • 使用适当的范围和正确的API调用,我可以成功调用SharePoint API。**

相关问题