flutter_appauth包问题:Google登录流程中重定向URI异常
解决Flutter中flutter_appauth集成Google登录的重定向URI问题
我在Flutter应用中使用flutter_appauth包集成Google登录时,按文档操作后遇到了重定向URI相关错误,以下是我的操作细节和问题排查:
我的操作步骤
- 更新app级build.gradle定义重定向Scheme:
manifestPlaceholders += [ 'appAuthRedirectScheme':'com.googleusercontent.apps.XXXXXXXX' ]
- 修改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>
- 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
相关产品推荐
相关产品推荐

