Flutter Android端MSAL登录失败,无明确错误原因求助
Flutter 基于MSAL的登录按钮实现问题
问题描述
尝试在Flutter(Android/iOS)应用中实现简易MSAL登录按钮,功能异常且无明确错误原因。先后使用msal_flutter 2.0.1(点击按钮直接崩溃)和azure_ad_authentication 1.0.4,多套配置文件无效,错误信息定位困难。
环境依赖
- azure_ad_authentication: ^1.0.4
- dart: ">=2.18.0 <3.0.0"
- flutter: ">=3.0.0"
错误日志
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
{ "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
<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
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
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应用配置
- 初始页面:

- 重定向配置:

内容的提问来源于stack exchange,提问作者prueba prueba
相关产品推荐
相关产品推荐

