android - 无法在 Android 上为 Azure AD 创建 SingleAccountPublicClientApplication
问题描述
根据https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-android上的说明,我使用 KeyTool 生成了开发签名哈希并在 Azure 门户中注册了我的应用程序。
门户生成 MSAL 配置,然后我将其粘贴到项目中的 res.raw.auth_config.json 中(my-app-client-id 和 my-app 的包名称只是下面示例中的占位符;实际值由自动生成天蓝色):
{
"client_id" : "<my-app-client-id>",
"authorization_user_agent" : "DEFAULT",
"redirect_uri" : "msauth://<my-app's package name>/npYKnQBHywGAasZflTy2xmdpEiU%3D",
"authorities" : [
{
"type": "AAD",
"audience": {
"type": "AzureADMultipleOrgs",
"tenant_id": "organizations"
}
}
]
}
然后我将以下内容添加到 AndroidManifest.xml:
<application>
[..]
<!--Intent filter to catch Microsoft's callback after Sign In-->
<activity
android:name="com.microsoft.identity.client.BrowserTabActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE"/>
<!--
Add in your scheme/host from registered redirect URI
note that the leading "/" is required for android:path
-->
<data
android:scheme="msauth"
android:host=""
android:path="/<signature-generated-by-keytool>" />
</intent-filter>
</activity>
[...]
</application>
在我的活动的 onCreate() 中,我尝试创建一个单一帐户客户端应用程序,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_single_account_model);
initializeUI();
PublicClientApplication.createSingleAccountPublicClientApplication(this,
R.raw.auth_config,
new IPublicClientApplication.ISingleAccountApplicationCreatedListener() {
@Override
public void onCreated(ISingleAccountPublicClientApplication application) {
mSingleAccountApp = application;
loadAccount();
}
@Override
public void onError(MsalException exception) {
displayError(exception);
}
});
}
不幸的是, PublicClientApplication.createSingleAccountPublicClientApplication()调用使应用程序崩溃,并出现以下错误:
java.lang.IllegalStateException:配置文件中的重定向 URI 与使用包名和签名哈希生成的不匹配。请验证配置文件中的 uri 和 Azure 门户中的应用注册。
我无法弄清楚为什么会发生这种情况,因为配置文件的内容是由 Azure 门户生成的,并且包名称、签名哈希和重定向 URI 与门户中显示的内容相匹配。
我会很感激任何建议。
解决方案
简而言之:这可能是您的调试密钥库的问题。我最近遇到了同样的问题,当我使用他们的说明在命令行上创建哈希时,它最终成为了一个问题。为我解决的问题是在 azure 门户上重新执行应用注册过程,当您在命令行上创建哈希时,请确保使用您的 android 密钥库的密码(默认为“android”)。我第一次这样做时,我使用了 jdk 密钥库的默认密码,它仍然为我创建了一个哈希,但它导致了你描述的错误。我不完全确定整个过程是如何运作的,并且希望另一个人来澄清,但我上面描述的内容为我解决了这个问题。
推荐阅读
- html - 如何扩展导航项以填充下拉菜单
- python - Django OneToOneField related name works for one Model but not another
- java - Converting YAML to Java Object
- excel - 如何通过比较文件名只打开特定的excel文件?
- javascript - Select table in db based on value of select tag
- python - 如何从 movie.get('casts') 函数中获取名称
- php - Laravel 路由可选参数到控制器
- git - 列出特定年份的所有提交
- c# - 属性窗口中的下拉列表从某个索引开始
- sql - sql逻辑理解