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

flutter_appauth包问题:Google登录流程中重定向URI异常

解决Flutter中flutter_appauth集成Google登录的重定向URI问题

我在Flutter应用中使用flutter_appauth包集成Google登录时,按文档操作后遇到了重定向URI相关错误,以下是我的操作细节和问题排查:

我的操作步骤

  1. 更新app级build.gradle定义重定向Scheme:
manifestPlaceholders += [
    'appAuthRedirectScheme':'com.googleusercontent.apps.XXXXXXXX'
]
  1. 修改AndroidManifest.xml添加重定向处理Activity:
<activity
    android:name="net.openid.appauth.RedirectUriReceiverActivity"
    android:theme="@style/NormalTheme"
    android:exported="true"
    tools:node="replace">
    <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:scheme="com.googleusercontent.apps.XXXXXXXX"
            android:host="auth"
            android:pathPrefix="/callback" />
    </intent-filter>
</activity>
  1. Flutter端触发登录的代码:
const clientId = 'xxxxxx.apps.googleusercontent.com';
const redirectUri = 'com.googleusercontent.apps.xxxxxx://auth/callback';
const issuer = 'https://accounts.google.com';
const scopes = ['openid', 'profile', 'email', 'https://www.googleapis.com/auth/drive.file'];

final FlutterAppAuth appAuth = FlutterAppAuth();

Future<void> googleSignIn() async {
  final supabase = SupabaseManager.instance;
  final prefs = await SharedPreferences.getInstance();
  final result = await appAuth.authorizeAndExchangeCode(
    AuthorizationTokenRequest(
      clientId,
      redirectUri,
      issuer: issuer,
      scopes: scopes,
      serviceConfiguration: AuthorizationServiceConfiguration(
          authorizationEndpoint: 'https://accounts.google.com/o/oauth2/v2/auth',
          tokenEndpoint: 'https://oauth2.googleapis.com/token'
      ),
    ),
  );
}

已尝试的排查操作

  • 核对Google Cloud Console中的客户端ID和重定向URI配置
  • 在Google Cloud Console的"授权域"中添加了googleusercontent.com
  • 严格按照flutter_appauth文档配置重定向逻辑

正确配置方案

1. 确保重定向URI全链路一致

  • Google Cloud Console中,找到对应的Android OAuth 2.0客户端ID,在「授权重定向URI」中添加完整的重定向URI(例如com.googleusercontent.apps.XXXXXXXXXX://auth/callback),必须和Flutter代码中的redirectUri完全一致。
  • build.gradle中的appAuthRedirectScheme只需填URI的scheme部分(即com.googleusercontent.apps.XXXXXXXXXX),不要带://auth/callback后缀。

2. 简化AndroidManifest配置

flutter_appauth会自动将RedirectUriReceiverActivity合并到你的Manifest中,手动添加反而容易引发冲突。建议删掉手动添加的该Activity配置,仅保留build.gradle中的manifestPlaceholders配置即可。

如果一定要手动配置,需修改tools:node="replace"为tools:node="merge",避免覆盖默认配置,同时确保intent-filter的scheme、host、pathPrefix与redirectUri完全匹配。

3. 优化Flutter代码

  • 移除手动指定的serviceConfiguration:当issuer设为https://accounts.google.com时,appAuth会自动通过OpenID Discovery获取授权和令牌端点,无需手动填写,减少出错概率。
  • 确认clientId是Google Cloud中Android客户端的ID,而非Web或其他类型的客户端ID。

修正后的Flutter代码示例:

const clientId = 'xxxxxx.apps.googleusercontent.com'; // 替换为你的Android客户端ID
const redirectUri = 'com.googleusercontent.apps.xxxxxx://auth/callback'; // 与Cloud Console配置一致
const issuer = 'https://accounts.google.com';
const scopes = ['openid', 'profile', 'email', 'https://www.googleapis.com/auth/drive.file'];

final FlutterAppAuth appAuth = FlutterAppAuth();

Future<void> googleSignIn() async {
  try {
    final result = await appAuth.authorizeAndExchangeCode(
      AuthorizationTokenRequest(
        clientId,
        redirectUri,
        issuer: issuer,
        scopes: scopes,
      ),
    );
    // 此处处理登录结果,如获取ID Token、Access Token等
  } catch (e) {
    print('登录失败: $e');
  }
}

4. 清理无效配置

Google Cloud Console中的「授权域」无需添加googleusercontent.com,这是Google官方域名,不需要额外授权。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:47:27