Azure active directory Microsoft Android应用程序未将签名哈希与应用程序回复URI匹配
目标:使用由创建的MS Identity应用程序,并尝试根据我们的需要定制应用程序 问题android应用程序未将签名哈希与应用程序的回复URI匹配 配置值 日志和屏幕截图 日志显示:配置文件中的重定向URI与使用包名和签名哈希生成的URI不匹配。 尝试的方法Azure active directory Microsoft Android应用程序未将签名哈希与应用程序回复URI匹配,azure-active-directory,microsoft-graph-api,msal,Azure Active Directory,Microsoft Graph Api,Msal,目标:使用由创建的MS Identity应用程序,并尝试根据我们的需要定制应用程序 问题android应用程序未将签名哈希与应用程序的回复URI匹配 配置值 日志和屏幕截图 日志显示:配置文件中的重定向URI与使用包名和签名哈希生成的URI不匹配。 尝试的方法 试图通过将android:path值更改为/ga0RGNYHvNM5d0SLGQfpQWAPGJ8%3D来修复此问题,但从用户界面收到以下消息: 试图直接从Azure Portal更改回复URI,但无法更改 尝试将android代
/ga0RGNYHvNM5d0SLGQfpQWAPGJ8%3D来修复此问题,但从用户界面收到以下消息:
msauth://com.azuresamples.msalandroidapp/ga0RGNYHvNM5d0SLGQfpQWAPGJ8%3D
但这会产生同样的错误
"client_id" : "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"authorization_user_agent" : "DEFAULT",
"redirect_uri" : "msauth://com.azuresamples.msalandroidapp/ga0RGNYHvNM5d0SLGQfpQWAPGJ8%3D",
"account_mode" : "SINGLE",
"broker_redirect_uri_registered": true,
"authorities" : [
{
"type": "AAD",
"authority_url": "https://login.microsoftonline.com/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
]
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.azuresamples.msalandroidapp">
...
<intent-filter>
...
<data
android:host="com.azuresamples.msalandroidapp"
android:path="/ga0RGNYHvNM5d0SLGQfpQWAPGJ8="
android:scheme="msauth" />
</intent-filter>
...
</manifest>
更新
我试图避免这种情况,但我已使用microsoft提供的debug.keystore更新了我的密钥库,该密钥库正常工作,但这不是生产环境的解决方案。我需要采取哪些步骤才能在生产环境中工作。这是MSAL Android团队的Dome 如果您想使用自己的密钥库,您必须这样做 com.azuresamples.msalandroidapp仅使用提供的debug.keystore的签名哈希进行注册
如果你还有其他问题,请告诉我。你也可以(我们一直在监控这个问题)。不确定这是否是一个相关的答案,但会分享我的经验。 在某个时候,我遇到了同样的问题,深入到库中,找出了散列是如何计算的。是这样的(我把它翻译成kotlin): 以这种方式计算的值与运行此命令的值不匹配:
keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
但这是msal图书馆希望得到的。同样的情况也发生在发布签名上。我还没有调查原因(可能是我做错了什么),但现在我使用的是从第一个方法获得的签名哈希,效果很好。我尝试了cmd和keytool,但没有成功。请尝试此代码以编程方式在代码中生成密钥哈希
String packageName = getApplicationContext().getPackageName();
try {
PackageInfo info = getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md;
md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
sha1Singature = new String(Base64.encode(md.digest(), 0));
//String something = new String(Base64.encodeBytes(md.digest()));
Log.e(AppConstants.TAG, sha1Singature);
}
} catch (PackageManager.NameNotFoundException e1) {
Log.e("name not found", e1.toString());
} catch (NoSuchAlgorithmException e) {
Log.e("no such an algorithm", e.toString());
} catch (Exception e) {
Log.e("exception", e.toString());
}
然后将此签名哈希设置为Azure portal。您使用了哪种签名,是开发还是生产?您是否在Azure app->Authentication选项卡中启用了适当的Android应用程序平台?是的,Android应用程序平台已启用Azure应用程序。另外,我使用的签名是production没有使用默认密钥库,我希望生成自己的最佳实践。我刚刚试着用debug.keystoren使用开发模式,它成功了吗?出于任何原因,我需要采取什么步骤来拥有自己的密钥库而不是使用默认密钥库?我认为出于Microsoft audit/proof的原因,您必须使用默认密钥库。这是文档中描述的唯一方法。我们需要生成自己的证书以用于登录和连接。那么,是否有一种方法可以替代生产?找不到任何关于此的文档。嗨@HKS,我正在重新验证您的问题。同时,如果可以解决您的问题,请您进行类似的检查并确认。我已经使用新的packagename[com.azure.mycompany]和所有东西注册了一个新的应用程序。生成了我自己的密钥库,然后运行keytools命令,遇到了相同的问题。您是否更改了应用程序的包名?MSAL在运行时根据应用程序的包名和签名哈希验证注册的重定向URI。
try {
val info = packageManager.getPackageInfo(
packageName,
PackageManager.GET_SIGNATURES
)
for (signature in info.signatures) {
val md = MessageDigest.getInstance("SHA")
md.update(signature.toByteArray())
val hash = Base64.encodeToString(
md.digest(),
Base64.DEFAULT
)
Log.d("KeyHash", "KeyHash:$hash")
}
} catch (e: PackageManager.NameNotFoundException) {
Log.d("KeyHash", e.toString())
} catch (e: NoSuchAlgorithmException) {
}
keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
String packageName = getApplicationContext().getPackageName();
try {
PackageInfo info = getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md;
md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
sha1Singature = new String(Base64.encode(md.digest(), 0));
//String something = new String(Base64.encodeBytes(md.digest()));
Log.e(AppConstants.TAG, sha1Singature);
}
} catch (PackageManager.NameNotFoundException e1) {
Log.e("name not found", e1.toString());
} catch (NoSuchAlgorithmException e) {
Log.e("no such an algorithm", e.toString());
} catch (Exception e) {
Log.e("exception", e.toString());
}