我正在开发一个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配置存在任何问题。
任何帮助都将不胜感激
1条答案
按热度按时间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。https://<tenantdomain>.sharepoint.com/.default
*必须给定调用sharepoint站点api的正确查询是
一米三米一x
我的验证码是:
代码,我得到如下,
令牌终结点:我用了我拿到的密码。