【发布时间】:2021-07-13 13:58:12
【问题描述】:
我正在使用 MSAL 以单帐户模式将用户登录到 Android 应用程序。这行得通。我希望能够使用收到的访问令牌来调用受 Azure AD 保护的 API 端点。我已注册客户端应用程序和 API,并已授予从 API 到客户端应用程序所需范围的访问权限。
这是来自我的build.gradle的库参考
implementation "com.microsoft.identity.client:msal:2.0.8"
我们在 Azure 门户中使用应用注册体验,并且在使用具有 Postman 的 OAuth2 token acquisition 功能的 v2.0 授权端点时,它工作正常。这是我的设置
Grant Type : Authorization Code (With PKCE)
Callback URL : "http://localhost"
Authorization URL : "https://login.microsoftonline.com/{{Tenant}}/oauth2/v2.0/authorize"
Token URL : "https://login.microsoftonline.com/{{Tenant}}/oauth2/v2.0/token"
Client ID & Client Secret from portal
Code Challenge Method: SHA-256
Scope : From API Registration
但是,来自 MSAL Android 的令牌没有范围或受众。身份验证失败,这是日志:
Authentication failed: com.microsoft.identity.client.exception.MsalDeclinedScopeException: Some or all requested scopes have been declined by the Server
这种行为似乎与使用旧的 Authorize 端点时会发生的情况相当一致。
无论如何,是否有解决此问题的方法/解决方法,或者我可以做些什么来使其正常工作?
编辑
这是 API 应用注册中暴露 API 刀片的屏幕截图
Expose API from API registration
这是我用来登录用户的 Kotlin 代码
var SCOPES = arrayOf("api://<api-app-id>/<scope-name>","api://<api-app-id>/scope-name>")
PublicClientApplication.createSingleAccountPublicClientApplication(
applicationContext,
R.raw.auth_config_single_account, object : ISingleAccountApplicationCreatedListener {
override fun onCreated(application: ISingleAccountPublicClientApplication) {
mSingleAccountApp = application
loadAccount() //processes the logged in account
}
override fun onError(exception: MsalException) {
}
})
loginButton.setOnClickListener(View.OnClickListener {
if (mSingleAccountApp == null) {
return@OnClickListener
}
getAuthInteractiveCallback()?.let { it1 ->
mSingleAccountApp!!.signIn(
this@MainActivity,
null,
SCOPES,
it1
)
}
})
【问题讨论】:
-
请分享您在 MSAL 中所做的事情。
-
@PamelaPeng Here's 我指的是这样做。我没有使用图形范围,而是使用自定义范围。我授予我的客户端应用注册权限以使用受保护的 API。我还将客户端应用添加到 API 注册的受信任应用中。
标签: android azure kotlin azure-active-directory msal