10

根据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 与门户中显示的内容相匹配。

我会很感激任何建议。

4

3 回答 3

8

简而言之:这可能是您的调试密钥库的问题。我最近遇到了同样的问题,当我使用他们的说明在命令行上创建哈希时,它最终成为了一个问题。为我解决的问题是在 azure 门户上重新执行应用注册过程,当您在命令行上创建哈希时,请确保使用您的 android 密钥库的密码(默认为“android”)。我第一次这样做时,我使用了 jdk 密钥库的默认密码,它仍然为我创建了一个哈希,但它导致了你描述的错误。我不完全确定整个过程是如何运作的,并且希望另一个人来澄清,但我上面描述的内容为我解决了这个问题。

于 2019-11-08T16:53:24.670 回答
4

我也面临同样的问题。要获得有效的签名哈希,请按照以下步骤操作。

步骤 1:在 LAUNCHER 活动的 onCreate 方法中运行以下方法。

科特林

@RequiresApi(Build.VERSION_CODES.P)
private fun getSignatureHash() {
   try {
      val info = packageManager.getPackageInfo(
         "<com.package.name>",
         PackageManager.GET_SIGNING_CERTIFICATES
      )
      for (signature in info.signingInfo.apkContentsSigners) {
         val md = MessageDigest.getInstance("SHA")
         md.update(signature.toByteArray())
         Log.d(
           "KeyHash", "KeyHash:" + Base64.encodeToString(
              md.digest(),
              Base64.DEFAULT
           )
         )
      }
   } catch (e: PackageManager.NameNotFoundException) {
   } catch (e: NoSuchAlgorithmException) {
   }
}

Java
https://github.com/AzureAD/microsoft-authentication-library-for-android/issues/914#issuecomment-582259223

try {
   PackageInfo info = getPackageManager().getPackageInfo(
      "<com.package.name>",
      PackageManager.GET_SIGNATURES
   );
   for (Signature signature : info.signatures) {
      MessageDigest md;
      md = MessageDigest.getInstance("SHA");
      md.update(signature.toByteArray());
      String something = new String(Base64.encode(md.digest(), 0));
      //String something = new String(Base64.encodeBytes(md.digest()));
      Log.e("KeyHash", something);
   }
} 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());
}

第 2 步:您应该在 Android Studio Logcat 中获取 HashKey。使用此 HasKey 在 Azure AD 中注册

于 2020-01-07T10:37:51.833 回答
0

对我来说,问题原来是 MS 门户要求我们使用与 Android studio 一起安装的默认 debug.keystore %HOMEPATH%\.android\debug.keystore

但是,ms-identity-android-java 示例在项目文件夹中有一个单独的 debug.keystore 文件;\ms-identity-android-java-master\gradle\debug.keystore。

使用这个文件来创建哈希,你就完成了:)

于 2020-06-11T13:12:11.790 回答