gpt4 book ai didi

java - Android 无法检索用于 Azure AD 身份验证的正确访问 token

转载 作者:行者123 更新时间:2023-12-03 06:25:18 26 4
gpt4 key购买 nike

我正在开发一个使用适用于 Android 的 MSAL 的 Android 应用程序。用户通过此库对自己进行身份验证以获得访问 token ,然后使用该 token 通过 Sharepoint Api 进行授权。

我有一个 Azure AD 注册设置,我们用它来提供 token 。我们已经有了该应用程序的工作版本,用户可以通过刷新 token 对自己进行身份验证。此引用 token 是使用标准 Microsoft 身份验证流程通过 Web 浏览器检索的(获取身份验证代码、使用代码调用 api 并保存刷新 token )。

我现在想要执行相同的身份验证,但使用 MSAL,而不是用户必须手动获取刷新 token 。我已经有一个工作配置并且可以使用 Microsoft 帐户登录,但是当我使用 token 调用 Sharepoint api 时,我们收到此错误:`

{"error_description":"引发了“Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException”类型的异常。"}

通过以下代码检索 token :

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);
}
};
}

检索到访问 token 后,我们用它来进行 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);
}

授权 header 包含带有“Bearer”前缀的 token 。

Azure AD 应用程序注册已配置正确的范围 + Android 应用程序的平台配置。大多数开发人员都会发现问题的范围设置不正确,但我没有发现 Azure 配置有任何问题。 snippet of the Azure API authorization page

如有任何帮助,我们将不胜感激

最佳答案

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

enter image description here

将范围指定为 https://.sharepoint.com/.default 并在 postman 中尝试该场景。

enter image description here

收到错误:无效的受众,即使在授予正确的范围和 API 权限并获得管理员同意后也是如此。

使用图表调用站点:

enter image description here

https://graph.microsoft.com/v1.0/sites

这里调用graph api时,我们需要有 https://graph.microsoft.com /.default 作为作用域,它在 API 调用时提供输出。对于带有 https://graph.microsoft.com 的调用 token 端点/.default 作为范围,然后使用具有图形范围的访问 token 调用 sharepoint api。

enter image description here

输出: https://graph.microsoft.com/v1.0/sites

enter image description here

但是,如果在不使用 grah api 端点的情况下调用站点端点,则范围必须为 https://<tenantdomain>.sharepoint.com/.default 必须给出

调用 sharepoint site api 的正确查询是

https://{tenant-name}.sharepoint.com/_api/v2.0/sites

enter image description here

我的授权码是:

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 

代码,我得到如下,

enter image description here

token 端点:我使用了我得到的代码。

通过适当的范围和正确的 api 调用,我可以成功调用 sharepoint api。

关于java - Android 无法检索用于 Azure AD 身份验证的正确访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75594431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com