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

使用Supabase实现第三方登录后重定向异常,跳转至Google错误页面

Supabase实现第三方登录后重定向异常,跳转至Google错误页面

看起来你遇到的是Supabase第三方登录后重定向的典型问题,我来帮你梳理几个可能的原因和对应的解决办法:

1. 先检查Supabase控制台的重定向URI配置

这是最容易忽略的关键点!你需要确保在Supabase项目的Auth -> URL Configuration页面中,把你的回调URL(比如http://localhost:5000/callback)添加到Allowed Redirect URLs列表里。开发环境的本地地址一定要加,不然第三方服务商(比如Google)会拒绝重定向,就会出现你看到的错误页面。

2. 别手动拼接授权URL,用Supabase官方方法生成

你现在自己拼接auth_url的方式很容易出现参数编码错误或者模式不匹配的问题。建议改用Supabase SDK提供的sign_in_with_oauth方法来生成授权链接,代码可以改成这样:

@app.route('/login/<provider>')
def login(provider):
    redirect_uri = url_for('callback', _external=True)
    # 用官方方法生成授权URL,避免手动拼接的错误
    oauth_response = supabase.auth.sign_in_with_oauth({
        "provider": provider,
        "options": {
            "redirect_to": redirect_uri
        }
    })
    return redirect(oauth_response.url)

3. 排查授权模式是否正确

你提到跳转后的URL带#access_token,这说明可能走了隐式授权模式,但我们需要的是授权码模式(Authorization Code Flow)——只有这个模式才会返回code参数给回调接口。

你可以去Supabase控制台的Auth -> Providers,找到对应的Google/GitHub等服务商,检查配置是否开启了授权码模式,确保没有勾选隐式模式的选项。

4. 修正回调函数的逻辑与异常处理

现在你的回调函数里,如果拿不到code就直接返回错误,建议先加日志排查请求参数,同时适配可能的哈希参数问题:

@app.route('/callback')
def callback():
    # 打印所有请求参数,方便排查问题
    logging.info(f"Callback request args: {request.args}")
    logging.info(f"Full callback URL: {request.url}")  # 查看完整URL包括哈希部分
    code = request.args.get('code')
    if code:
        try:
            # 用官方方法交换code获取会话
            session_response = supabase.auth.exchange_code_for_session(code)
            user = session_response.user
            # 注意:新版本SDK中user是对象,需要转成字典才能存在session里
            session['user'] = user.dict()
            logging.info(f"User info: {user}")
            return redirect('/dashboard')
        except Exception as e:
            logging.error(f"Authentication error: {str(e)}")
            return "Authentication failed", 400
    # 如果没拿到code,可能是哈希模式的问题,尝试客户端处理
    return '''
        <script>
            const hash = window.location.hash.slice(1);
            const params = new URLSearchParams(hash);
            const accessToken = params.get('access_token');
            if (accessToken) {
                window.location.href = '/dashboard';
            }
        </script>
        Authentication failed, redirecting...
    '''

另外要注意,新版本Supabase SDK中supabase.auth.user()已被弃用,建议用session_response.user来获取用户信息,并且存到session时要转成字典(Flask的session只支持可序列化的数据)。

5. 最后再试一次清除缓存并重启服务

虽然你已经清过缓存,但修改完配置和代码后,记得重启你的Flask应用,同时清除浏览器的缓存和Cookie,确保新的配置生效。

备注:内容来源于stack exchange,提问作者user11495097

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:37:57