使用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

