使用flutter_appauth实现OAuth2时登录成功后无法跳转至Flutter应用
1. 修复重定向URI格式错误
你代码里的重定向URI写的是com.app.app:/oauthredirect,这里用了单斜杠,不符合标准URI格式,正确写法应该是双斜杠:com.app.app://oauthredirect。格式错误会导致flutter_appauth无法识别scheme,同时后端Django OAuth2 Toolkit也会拒绝该重定向地址。
修改oauth2.dart中的参数:
AuthorizationTokenRequest( 'client_id', 'com.app.app://oauthredirect', // 替换为双斜杠格式 // 其余配置保持不变 ),
2. 配置Django OAuth2 Toolkit允许自定义Scheme
Django OAuth2 Toolkit默认只放行http/https协议的重定向URI,自定义app scheme(如com.app.app)需要手动加入允许列表。
在Django项目的settings.py中添加配置:
OAUTH2_PROVIDER = { # 保留原有配置... 'ALLOWED_REDIRECT_URI_SCHEMES': ['com.app.app'], }
添加完成后重启Django服务,确保后端已生效该配置。
3. 检查Android端Intent Filter配置
虽然你在build.gradle中配置了appAuthRedirectScheme,但需确保AndroidManifest.xml中存在对应的intent-filter(若自动生成失败则手动补充):
打开android/app/src/main/AndroidManifest.xml,在主<activity>标签内添加:
<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.app.app" android:host="oauthredirect" /> </intent-filter>
该配置会让系统识别到com.app.app://oauthredirect地址时,唤起你的Flutter应用。
4. 解决discoveryUrl崩溃问题
之前使用discoveryUrl时应用崩溃,大概率是以下原因:
- 后端OpenID配置文档(
/.well-known/openid-configuration)返回内容不符合标准格式,或端点地址错误 - 模拟器访问
10.0.2.2时网络不通,需确认后端服务正常运行、端口正确
先在浏览器中访问http://10.0.2.2:8000/api/oauth2/.well-known/openid-configuration,验证返回的JSON中authorization_endpoint和token_endpoint与你手动配置的一致。确认无误后,再尝试启用discoveryUrl:
discoveryUrl: "http://10.0.2.2:8000/api/oauth2/.well-known/openid-configuration", // 注释掉serviceConfiguration相关代码
验证步骤
- 重启Flutter应用与Django服务
- 点击登录按钮完成网页端登录后,应自动跳转回Flutter应用,控制台会打印token信息
内容的提问来源于stack exchange,提问作者Khqy Op

