You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flet构建的Android应用Google OAuth通用流程返回400 invalid_request错误求助

Flet构建的Android应用Google OAuth通用流程返回400 invalid_request错误求助

问题重述

你开发的Flet Android应用在使用Google OAuth通用授权流程(通过自定义深链接MyFirstApp://callback)时遇到400: invalid_request错误,但OOB模式(urn:ietf:wg:oauth:2.0:oob)在桌面和移动端都能正常工作。你已经在Google Cloud配置了Android OAuth客户端(包名、SHA-1指纹、自定义URI Scheme),并在Flet build命令中指定了深链接参数,但授权请求始终失败。

核心排查方向 & 解决方案

结合你的配置和代码,我整理了几个最可能导致问题的点,以及对应的修复步骤:


1. 最关键:Google Cloud Android客户端未添加自定义重定向URI

这是这类400错误的头号原因——Google Cloud的Android OAuth客户端默认不会自动将你的自定义深链接加入授权重定向URI列表,必须手动添加:

  • 登录Google Cloud Console → 进入你的项目 → 导航到「APIs与服务」→「凭据」
  • 找到你创建的「Android 客户端ID」,点击「编辑」
  • 在「已获授权的重定向URI」区域,点击「添加URI」,输入MyFirstApp://callback,然后保存

Google OAuth会严格校验授权请求中的redirect_uri是否在客户端的允许列表中,不在列表里直接返回invalid_request。


2. 确认SHA-1指纹与包名完全匹配

你提到用了dev keystore的SHA-1,务必确保这个指纹和Google Cloud配置的完全一致:

  • 如果使用Flet默认的debug keystore,运行以下命令获取正确的SHA-1:
    keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
    
  • 检查Google Cloud中Android客户端的「包名」com.silentlybren.myfirstapp和「SHA-1证书指纹」是否和实际build用的keystore完全一致(大小写、字符都不能错)

3. 修正Flet Build的深链接参数(细节校验)

你的build命令看起来是对的,但再确认几个细节:

flet build apk --project "MyFirstApp" --product "MyFirstApp" --android-adaptive-icon-background "#1E1E1E" --deep-linking-scheme MyFirstApp --deep-linking-host callback --org com.silentlybren
  • --deep-linking-scheme MyFirstApp必须和你redirect URI的scheme完全一致(MyFirstApp://callback中的MyFirstApp
  • --deep-linking-host callback对应redirect URI的host部分,确保没有多余的路径或参数
  • 如果你用了自定义keystore,需要添加--android-keystore参数指定keystore路径,避免Flet用默认debug keystore导致SHA-1不匹配

4. 代码中的授权URL参数校验

你的google_auth.py中生成授权URL的逻辑基本正确,但需要补充两个小检查:

  • 确保REDIRECT_URI_ANDROID的大小写和Google Cloud配置的完全一致(比如MyFirstApp不能写成myfirstappcallback不能写成Callback,Google OAuth对redirect URI大小写敏感)
  • 打印生成的授权URL进行验证:在get_auth_url方法末尾添加print(f"Generated auth URL: {auth_url}"),然后用adb logcat | grep "Generated auth URL"查看日志,确认redirect_uri参数确实是MyFirstApp://callback,没有拼写错误

5. 验证Flet生成的深链接Intent Filter

Flet的--deep-linking参数应该会自动在AndroidManifest.xml中添加对应的Intent Filter,你可以解压APK文件(用zip工具打开),检查AndroidManifest.xml是否包含以下内容:

<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="MyFirstApp" android:host="callback" />
</intent-filter>

如果没有这个Intent Filter,说明Flet build参数没有生效,尝试升级Flet到最新版本:

pip install -U flet

然后重新build APK。


额外验证步骤

  1. 完成上述修复后,先卸载手机上的旧APK,再安装新构建的版本
  2. 启动应用,点击「Start Sign In」,观察跳转的Google授权页面是否还报错
  3. 如果仍然报错,尝试用抓包工具(比如Charles)捕获授权请求,对比redirect_uri参数和Google Cloud配置的是否完全一致

代码小优化建议

main.py的路由处理逻辑中,你可以简化参数解析(避免手动split),用urllib.parse更可靠:

def on_route_change(e):
    route = page.route
    if route and '/callback' in route:
        # 用urllib解析参数更可靠
        parsed = urllib.parse.urlparse(f"http://dummy.com{route}")
        params = urllib.parse.parse_qs(parsed.query)
        if 'code' in params:
            code = params['code'][0]
            code = urllib.parse.unquote(code)
            self._handle_oauth_callback(code)
            return

这样可以避免手动split参数时的边界问题(比如多个参数的情况)。

如果完成以上步骤后还是有问题,你可以把授权请求的完整URL贴出来(隐去client_id),或者Google报错页面的完整细节,这样能更精准排查!

火山引擎 最新活动