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

Flutter Web集成Microsoft认证:重定向后后续代码不执行问题

Flutter Web 中 aad_oauth 微软认证重定向后代码不执行的解决方案

问题根源

Flutter Web 的 OAuth2 授权流程依赖浏览器重定向,当用户在微软认证页面完成操作返回应用时,原有的异步调用上下文已丢失,导致最初的 await oauth.login() 无法触发后续代码。aad_oauth 文档提到的"再次调用 login",本质是让库在应用初始化时检查URL中的认证回调参数,完成剩余的认证流程。

解决步骤

1. 全局复用 AadOAuth 实例

不要在登录函数内每次新建 AadOAuth 实例,Web端需要同一个实例来跟踪认证状态和处理回调:

// 全局定义,确保整个应用只有一个实例
late AadOAuth oauth;

2. 应用初始化时处理回调

在应用启动阶段(如 main 函数或根Widget的 initState)初始化实例并调用一次 login(),此时如果是认证回调返回的页面,库会直接解析URL参数返回结果,不会再次跳转微软页面:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 全局导航键,确保路由跳转正常
  final navigatorKey = GlobalKey<NavigatorState>();
  
  final config = Config(
    tenant: "common",
    clientId: "xxx",
    scope: "https://graph.microsoft.com/User.Read https://graph.microsoft.com/Calendars.ReadWrite offline_access",
    redirectUri: "xxx", // 需与Azure Portal注册的重定向URI完全一致
    navigatorKey: navigatorKey,
  );
  
  oauth = AadOAuth(config);
  // 初始化时检查回调,完成认证流程
  oauth.login();
  
  runApp(MyApp(navigatorKey: navigatorKey));
}

3. 修改登录函数逻辑

使用全局实例发起登录,避免重复创建实例:

Future<String?> loginUserWithMicrosoft(User user, String adminID) async {
  try {
    print("Initiating Login");
    final result = await oauth.login();
    print("Login Result: $result");

    return result.fold(
      (l) {
        print("Login Failed: $l");
        return null;
      },
      (r) {
        print("Login Successful: $r");
        if (r.refreshToken != null) {
          updateUserRefreshToken(adminID, user.userID, r.refreshToken!);
        }
        if (r.accessToken != null) {
          updateUserAccessToken(adminID, user.userID, r.accessToken!);
        }
        return r.accessToken;
      },
    );
  } catch (e) {
    print("Error during login: $e");
    return null;
  }
}

额外注意事项

  • 重定向URI配置:确保Azure Portal中注册的应用里,Web平台的重定向URI和代码中的 redirectUri 完全一致(包括HTTP/HTTPS、域名、端口)。
  • 路由状态:避免在认证过程中销毁根Widget,确保全局导航键始终有效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:47:37