gor*_*ieb 10 android azure-active-directory android-signing
按照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"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
然后我将以下内容添加到 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>
Run Code Online (Sandbox Code Playgroud)
在我的活动的 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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,PublicClientApplication.createSingleAccountPublicClientApplication()调用使应用程序崩溃并出现以下错误:
java.lang.IllegalStateException: 配置文件中的重定向 URI 与使用包名和签名哈希生成的 URI 不匹配。请验证配置文件中的 uri 和 Azure 门户中的应用程序注册。
我无法弄清楚为什么会发生这种情况,因为配置文件的内容是由 Azure 门户生成的,并且包名称、签名哈希和重定向 URI 与门户中显示的内容相匹配。
我很感激任何建议。
小智 8
简而言之:这可能是您的调试密钥库存在问题。我最近遇到了同样的问题,当我使用他们的说明在命令行上创建哈希时,它最终成为一个问题。为我解决的是在 azure 门户上重新进行应用程序注册过程,并且当您在命令行上创建哈希时,请确保使用您的 android 密钥库的密码(默认为“android”)。我第一次这样做时,我使用了 jdk 密钥库的默认密码,它仍然为我创建了一个散列,但它导致了您描述的错误。我不完全确定整个过程是如何工作的,并且希望另一个人澄清,但我上面描述的内容为我解决了这个问题。
小智 5
我也面临同样的问题。要获得有效的签名哈希,请按照以下步骤操作。
步骤 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) {
}
}
Run Code Online (Sandbox Code Playgroud)
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());
}
Run Code Online (Sandbox Code Playgroud)
第 2 步:您应该在 Android Studio Logcat 中获取 HashKey。使用此 HasKey 在 Azure AD 中注册
| 归档时间: |
|
| 查看次数: |
2416 次 |
| 最近记录: |