You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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应用配置

  • 初始页面:初始页面
  • 重定向配置:Android重定向配置

内容的提问来源于stack exchange,提问作者prueba prueba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:05:24