Azure active directory Microsoft Android应用程序未将签名哈希与应用程序回复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代

目标:使用由创建的MS Identity应用程序,并尝试根据我们的需要定制应用程序

问题android应用程序未将签名哈希与应用程序的回复URI匹配

配置值 日志和屏幕截图 日志显示:配置文件中的重定向URI与使用包名和签名哈希生成的URI不匹配。

尝试的方法
  • 试图通过将android:path值更改为
    /ga0RGNYHvNM5d0SLGQfpQWAPGJ8%3D来修复此问题,但从用户界面收到以下消息:
    

  • 试图直接从Azure Portal更改回复URI,但无法更改

  • 尝试将android代码中的重定向URI更改为
    msauth://com.azuresamples.msalandroidapp/ga0RGNYHvNM5d0SLGQfpQWAPGJ8%3D
    但这会产生同样的错误

  • 代码中的默认库是1.2,在gradle中将其更改为1.5+,但仍然不起作用

  • 配置文件 auth_config_single_account.json

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