[英]MSAL login fails in Flutter app (android), no clear error why
I'm trying to make a simple login button using msal login inside a Flutter app (Android and IOS), but it simply does not work and I dont know why.我正在尝试在 Flutter 应用程序(Android 和 IOS)中使用 msal 登录创建一个简单的登录按钮,但它根本不起作用,我也不知道为什么。 I'm using azure_ad_authentication 1.0.4 (before that I tried msal_flutter 2.0.1 but when i pressed the button it just crashed the whole program) I tried many configuration files, but I can not be able to make this work and the error is not clear enough to find a solution.
我正在使用 azure_ad_authentication 1.0.4(在此之前我尝试过 msal_flutter 2.0.1 但是当我按下按钮时它只是让整个程序崩溃)我尝试了很多配置文件,但我无法完成这项工作并且错误是不够清楚,无法找到解决方案。
error错误
D/DART/NATIVE( 9305): onMethodCall initialize
D/EGL_emulation( 9305): app_time_stats: avg=482603.22ms min=482603.22ms max=482603.22ms count=1
W/LibraryConfiguration( 9305): [2023-01-24 15:02:33 - thread_name : Thread-26, correlation_id : UNSET] Android 32 MsalConfiguration was already initialized
W/LocalMSALController:getDeviceMode( 9305): [2023-01-24 15:02:33 - thread_name : pool-11-thread-1, correlation_id : caeccf19-fa22-4ea3-be4d-8c44573f4ae4] Android 32 LocalMSALController is not eligible to use the broker. Do not check sharedDevice mode and return false immediately.
W/Telemetry( 9305): [2023-01-24 15:02:33 - thread_name : main, correlation_id : UNSET] Android 32 Telemetry is disabled because the Telemetry context or configuration is null
E/flutter ( 9305): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Instance of 'MsalInitializationException'
E/flutter ( 9305): #0 AzureAdAuthentication._initialize (package:azure_ad_authentication/azure_ad_authentication.dart:142:7)
E/flutter ( 9305): <asynchronous suspension>
E/flutter ( 9305): #1 AzureAdAuthentication.createPublicClientApplication (package:azure_ad_authentication/azure_ad_authentication.dart:34:5)
E/flutter ( 9305): <asynchronous suspension>
msal_default_config.json msal_default_config.json
{
"client_id" : "[CLIENT_ID]",
"authorization_user_agent" : "DEFAULT",
"redirect_uri" : "msauth://com.example.app/[hash]",
"authorities": [
{
"type": "AAD",
"audience": {
"type": "AzureADandPersonalMicrosoftAccount"
},
"tenant_id": "common",
"default": true
}
],
"minimum_required_broker_protocol_version": "3.0",
"multiple_clouds_supported": false,
"broker_redirect_uri_registered": true,
"web_view_zoom_controls_enabled": true,
"web_view_zoom_enabled": true,
"environment": "Debug",
"power_opt_check_for_network_req_enabled": true,
"handle_null_taskaffinity": false,
"authorization_in_current_task": false,
"http": {
"connect_timeout": 10000,
"read_timeout": 30000
},
"logging": {
"pii_enabled": false,
"log_level": "WARNING",
"logcat_enabled": true
},
"account_mode": "SINGLE",
"browser_safelist": [
{
"browser_package_name": "com.android.chrome",
"browser_signature_hashes": [
"7fmduHKTdHHrlMvldlEqAIlSfii1tl35bxj1OXN5Ve8c4lU6URVu4xtSHc3BVZxS6WWJnxMDhIfQN0N0K2NDJg=="
]
},
{
"browser_package_name": "org.mozilla.firefox",
"browser_signature_hashes": [
"2gCe6pR_AO_Q2Vu8Iep-4AsiKNnUHQxu0FaDHO_qa178GByKybdT_BuE8_dYk99G5Uvx_gdONXAOO2EaXidpVQ=="
]
},
{
"browser_package_name": "com.sec.android.app.sbrowser",
"browser_signature_hashes": [
"ABi2fbt8vkzj7SJ8aD5jc4xJFTDFntdkMrYXL3itsvqY1QIw-dZozdop5rgKNxjbrQAd5nntAGpgh9w84O1Xgg=="
]
},
{
"browser_package_name": "com.cloudmosa.puffinFree",
"browser_signature_hashes": [
"1WqG8SoK2WvE4NTYgr2550TRhjhxT-7DWxu6C_o6GrOLK6xzG67Hq7GCGDjkAFRCOChlo2XUUglLRAYu3Mn8Ag=="
]
},
{
"browser_package_name": "com.duckduckgo.mobile.android",
"browser_signature_hashes": [
"S5Av4cfEycCvIvKPpKGjyCuAE5gZ8y60-knFfGkAEIZWPr9lU5kA7iOAlSZxaJei08s0ruDvuEzFYlmH-jAi4Q=="
]
},
{
"browser_package_name": "com.explore.web.browser",
"browser_signature_hashes": [
"BzDzBVSAwah8f_A0MYJCPOkt0eb7WcIEw6Udn7VLcizjoU3wxAzVisCm6bW7uTs4WpMfBEJYf0nDgzTYvYHCag=="
]
},
{
"browser_package_name": "com.ksmobile.cb",
"browser_signature_hashes": [
"lFDYx1Rwc7_XUn4KlfQk2klXLufRyuGHLa3a7rNjqQMkMaxZueQfxukVTvA7yKKp3Md3XUeeDSWGIZcRy7nouw=="
]
},
{
"browser_package_name": "com.microsoft.emmx",
"browser_signature_hashes": [
"Ivy-Rk6ztai_IudfbyUrSHugzRqAtHWslFvHT0PTvLMsEKLUIgv7ZZbVxygWy_M5mOPpfjZrd3vOx3t-cA6fVQ=="
]
},
{
"browser_package_name": "com.opera.browser",
"browser_signature_hashes": [
"FIJ3IIeqB7V0qHpRNEpYNkhEGA_eJaf7ntca-Oa_6Feev3UkgnpguTNV31JdAmpEFPGNPo0RHqdlU0k-3jWJWw=="
]
},
{
"browser_package_name": "com.opera.mini.native",
"browser_signature_hashes": [
"TOTyHs086iGIEdxrX_24aAewTZxV7Wbi6niS2ZrpPhLkjuZPAh1c3NQ_U4Lx1KdgyhQE4BiS36MIfP6LbmmUYQ=="
]
},
{
"browser_package_name": "mobi.mgeek.TunnyBrowser",
"browser_signature_hashes": [
"RMVoXuK1sfJZuGZ8onG1yhMc-sKiAV2NiB_GZfdNlN8XJ78XEE2wPM6LnQiyltF25GkHiPN2iKQiGwaO2bkyyQ=="
]
},
{
"browser_package_name": "org.mozilla.focus",
"browser_signature_hashes": [
"L72dT-stFqomSY7sYySrgBJ3VYKbipMZapmUXfTZNqOzN_dekT5wdBACJkpz0C6P0yx5EmZ5IciI93Q0hq0oYA=="
]
},
{
"browser_package_name": "com.cake.browser",
"browser_signature_hashes": [
"442kvSdZT1fEAewzSi8Wre73x4mWmHBhOFtQ-9T9N6ExZzUdsELUmaaS0edsI7ur2nY-bjbWX7IpluFOyvKkOA=="
]
},
{
"browser_package_name": "com.brave.browser",
"browser_signature_hashes": [
"wIwX1v_1TfPxHm5qn-_jdGoH3Pa9VVMR5dtVz0Y0xqPkyM_KlavjWPSgOolrVH05AVO1cHWoLPqMzCH04Pw8LQ=="
]
},
{
"browser_package_name": "com.kiwibrowser.browser",
"browser_signature_hashes": [
"kmPeixKA04JcDuWNBMUPu_6WaODr6a9ofROUIHIGxiiFGvH8Y92MonrDQmsNqEJO2DQkpEQc425WmAYB4NlD3Q=="
]
},
{
"browser_package_name": "com.mi.globalbrowser.mini",
"browser_signature_hashes": [
"6FEWlPfWn-omfES2ZYDj5bZUIR5au_nfyRr-o_1R3fesjfoV1JptBMumtvVIo0q37abcMRWQt9RUSNXpzKpNdA=="
]
},
{
"browser_package_name": "mark.via.gp",
"browser_signature_hashes": [
"oTJf5e5nB1NinkdBpkkmhPnwbVRmDlHZ-s_QhvyuGKM5nq5XtjA439O31wxrkL6ReHyyKfDHFUHpQnoXoj--Ig=="
]
}
]
}
AndroidManifest.xml AndroidManifest.xml
<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" />
<data
android:host="com.example.app"
android:path="/[hash]"
android:scheme="msauth" />
</intent-filter>
</activity>
build.gradle build.gradle
android {
... OTHER STUFF
signingConfigs {
debug {
keyAlias 'xxxx'
keyPassword 'xxxxx'
storeFile file('[path_to]\\keystore.jks')
storePassword 'xxxxx'
}
}
}
dependencies {
... OTHER IMPLEMENTATIONS
implementation "com.microsoft.identity.client:msal:3.0.+"
}
allprojects {
repositories {
mavenCentral()
maven {
url 'https://pkgs.dev.azure.com/MicrosoftDeviceSDK/DuoSDK-Public/_packaging/Duo-SDK-Feed/maven/v1'
}
}
}
button.dart按钮.dart
Widget MyButton(
onPressed: () async {
_acquireToken();
},
)
Future<void> _acquireToken() async {
await getResult();
}
String _output = 'NONE';
static const List<String> kScopes = [
"https://graph.microsoft.com/user.read",
];
Future<String> getResult({bool isAcquireToken = true}) async {
AzureAdAuthentication pca = await intPca();
String? res;
UserAdModel? userAdModel;
try {
if (isAcquireToken) {
userAdModel = await pca.acquireToken(scopes: kScopes);
} else {
userAdModel = await pca.acquireTokenSilent(scopes: kScopes);
}
} on MsalUserCancelledException {
res = "User cancelled";
} on MsalNoAccountException {
res = "no account";
} on MsalInvalidConfigurationException {
res = "invalid config";
} on MsalInvalidScopeException {
res = "Invalid scope";
} on MsalException {
res = "Error getting token. Unspecified reason";
}
setState(() {
_output = (userAdModel?.toJson().toString() ?? res)!;
});
return (userAdModel?.toJson().toString() ?? res)!;
}
Future<AzureAdAuthentication> intPca() async {
return await AzureAdAuthentication.createPublicClientApplication(
clientId: "[CLIENT_ID]",
authority: "https://login.microsoftonline.com/common/",
);
}
Azure AD app Azure 广告应用
Redirects重定向
I found the solution faster than expected.我比预期更快地找到了解决方案。
The problem was, mainly, the "redirect_uri" hash in msal_default_config.json file and android:path hash in AndroidManifest.xml.问题主要是 msal_default_config.json 文件中的“redirect_uri”hash 和 AndroidManifest.xml 中的 android:path hash。 In msal_default_config.json the hash code that you generated using keytool must be base64 encoded and in AndroidManifest.xml must be "as it is" (not encoded).
在 msal_default_config.json 中,您使用 keytool 生成的 hash 代码必须是 base64 编码,而在 AndroidManifest.xml 中必须是“原样”(未编码)。 In msal_default_config.json I had top change some extra configurations like environment and account_mode.
在 msal_default_config.json 中,我不得不更改一些额外的配置,例如环境和帐户模式。
I found two pages with the solution.我找到了两页解决方案。 https://github.com/AzureAD/microsoft-authentication-library-for-android/issues/1524#issuecomment-942414368 and https://github.com/AzureAD/microsoft-authentication-library-for-android/wiki/MSAL-FAQ .
https://github.com/AzureAD/microsoft-authentication-library-for-android/issues/1524#issuecomment-942414368和https://github.com/AzureAD/microsoft-authentication-library-for-android/wiki/ MSAL-常见问题解答。 The second one is clearer than the first one.
第二个比第一个更清楚。
Here are the changes made in the files previously listed:以下是对先前列出的文件所做的更改:
msal_default_config.json msal_default_config.json
{
"client_id" : "[CLIENT_ID]",
"authorization_user_agent" : "DEFAULT",
"redirect_uri" : "msauth://com.example.app/[HASH_ENCODED]",
"authorities": [
{
"type": "AAD",
"audience": {
"type": "AzureADandPersonalMicrosoftAccount"
},
"tenant_id": "common",
"default": true
}
],
"minimum_required_broker_protocol_version": "3.0",
"multiple_clouds_supported": false,
"broker_redirect_uri_registered": true,
"web_view_zoom_controls_enabled": true,
"web_view_zoom_enabled": true,
"environment": "Production",
"power_opt_check_for_network_req_enabled": true,
"handle_null_taskaffinity": false,
"authorization_in_current_task": false,
"http": {
"connect_timeout": 10000,
"read_timeout": 30000
},
"logging": {
"pii_enabled": false,
"log_level": "WARNING",
"logcat_enabled": true
},
"account_mode": "MULTIPLE",
"browser_safelist": [
{
"browser_package_name": "com.android.chrome",
"browser_signature_hashes": [
"7fmduHKTdHHrlMvldlEqAIlSfii1tl35bxj1OXN5Ve8c4lU6URVu4xtSHc3BVZxS6WWJnxMDhIfQN0N0K2NDJg=="
]
},
{
"browser_package_name": "org.mozilla.firefox",
"browser_signature_hashes": [
"2gCe6pR_AO_Q2Vu8Iep-4AsiKNnUHQxu0FaDHO_qa178GByKybdT_BuE8_dYk99G5Uvx_gdONXAOO2EaXidpVQ=="
]
},
{
"browser_package_name": "com.sec.android.app.sbrowser",
"browser_signature_hashes": [
"ABi2fbt8vkzj7SJ8aD5jc4xJFTDFntdkMrYXL3itsvqY1QIw-dZozdop5rgKNxjbrQAd5nntAGpgh9w84O1Xgg=="
]
},
{
"browser_package_name": "com.cloudmosa.puffinFree",
"browser_signature_hashes": [
"1WqG8SoK2WvE4NTYgr2550TRhjhxT-7DWxu6C_o6GrOLK6xzG67Hq7GCGDjkAFRCOChlo2XUUglLRAYu3Mn8Ag=="
]
},
{
"browser_package_name": "com.duckduckgo.mobile.android",
"browser_signature_hashes": [
"S5Av4cfEycCvIvKPpKGjyCuAE5gZ8y60-knFfGkAEIZWPr9lU5kA7iOAlSZxaJei08s0ruDvuEzFYlmH-jAi4Q=="
]
},
{
"browser_package_name": "com.explore.web.browser",
"browser_signature_hashes": [
"BzDzBVSAwah8f_A0MYJCPOkt0eb7WcIEw6Udn7VLcizjoU3wxAzVisCm6bW7uTs4WpMfBEJYf0nDgzTYvYHCag=="
]
},
{
"browser_package_name": "com.ksmobile.cb",
"browser_signature_hashes": [
"lFDYx1Rwc7_XUn4KlfQk2klXLufRyuGHLa3a7rNjqQMkMaxZueQfxukVTvA7yKKp3Md3XUeeDSWGIZcRy7nouw=="
]
},
{
"browser_package_name": "com.microsoft.emmx",
"browser_signature_hashes": [
"Ivy-Rk6ztai_IudfbyUrSHugzRqAtHWslFvHT0PTvLMsEKLUIgv7ZZbVxygWy_M5mOPpfjZrd3vOx3t-cA6fVQ=="
]
},
{
"browser_package_name": "com.opera.browser",
"browser_signature_hashes": [
"FIJ3IIeqB7V0qHpRNEpYNkhEGA_eJaf7ntca-Oa_6Feev3UkgnpguTNV31JdAmpEFPGNPo0RHqdlU0k-3jWJWw=="
]
},
{
"browser_package_name": "com.opera.mini.native",
"browser_signature_hashes": [
"TOTyHs086iGIEdxrX_24aAewTZxV7Wbi6niS2ZrpPhLkjuZPAh1c3NQ_U4Lx1KdgyhQE4BiS36MIfP6LbmmUYQ=="
]
},
{
"browser_package_name": "mobi.mgeek.TunnyBrowser",
"browser_signature_hashes": [
"RMVoXuK1sfJZuGZ8onG1yhMc-sKiAV2NiB_GZfdNlN8XJ78XEE2wPM6LnQiyltF25GkHiPN2iKQiGwaO2bkyyQ=="
]
},
{
"browser_package_name": "org.mozilla.focus",
"browser_signature_hashes": [
"L72dT-stFqomSY7sYySrgBJ3VYKbipMZapmUXfTZNqOzN_dekT5wdBACJkpz0C6P0yx5EmZ5IciI93Q0hq0oYA=="
]
},
{
"browser_package_name": "com.cake.browser",
"browser_signature_hashes": [
"442kvSdZT1fEAewzSi8Wre73x4mWmHBhOFtQ-9T9N6ExZzUdsELUmaaS0edsI7ur2nY-bjbWX7IpluFOyvKkOA=="
]
},
{
"browser_package_name": "com.brave.browser",
"browser_signature_hashes": [
"wIwX1v_1TfPxHm5qn-_jdGoH3Pa9VVMR5dtVz0Y0xqPkyM_KlavjWPSgOolrVH05AVO1cHWoLPqMzCH04Pw8LQ=="
]
},
{
"browser_package_name": "com.kiwibrowser.browser",
"browser_signature_hashes": [
"kmPeixKA04JcDuWNBMUPu_6WaODr6a9ofROUIHIGxiiFGvH8Y92MonrDQmsNqEJO2DQkpEQc425WmAYB4NlD3Q=="
]
},
{
"browser_package_name": "com.mi.globalbrowser.mini",
"browser_signature_hashes": [
"6FEWlPfWn-omfES2ZYDj5bZUIR5au_nfyRr-o_1R3fesjfoV1JptBMumtvVIo0q37abcMRWQt9RUSNXpzKpNdA=="
]
},
{
"browser_package_name": "mark.via.gp",
"browser_signature_hashes": [
"oTJf5e5nB1NinkdBpkkmhPnwbVRmDlHZ-s_QhvyuGKM5nq5XtjA439O31wxrkL6ReHyyKfDHFUHpQnoXoj--Ig=="
]
}
]
}
AndroidManifest.xml AndroidManifest.xml
<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" />
<data
android:host="com.example.app"
android:path="[HASH_NOT_ENCODED]"
android:scheme="msauth" />
</intent-filter>
</activity>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.