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

Flask应用通过Google Authentication登录后如何重定向到前一页面

解决方案

你遇到的重定向次数过多问题,核心原因是存储目标跳转地址的逻辑没有排除OAuth回调、登录入口这类不需要登录校验的路由,导致session里反复存入回调路由地址,登录后跳转触发循环校验。以下是可直接落地的最优实现方案:


第一步:调整登录前目标地址存储逻辑

在你的登录校验装饰器/拦截逻辑中,仅对GET请求、非登录相关路由的地址做存储,避免存入无效的回调、登录入口地址:

from flask import request, session, redirect, url_for
from functools import wraps

# 你自己的登录校验装饰器,替换原有逻辑即可
def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        # 这里替换成你自己的登录状态判断逻辑
        if 'user_info' not in session:
            # 仅GET请求+非登录/回调路由才存储目标地址
            if request.method == 'GET' and request.endpoint not in ['google_login', 'google_callback']:
                session['next_url'] = request.url
            return redirect(url_for('google_login'))
        return f(*args, **kwargs)
    return decorated_function

第二步:调整谷歌授权回调的跳转逻辑

登录校验完成后优先读取存储的地址,跳转前做同域校验避免开放重定向漏洞,读取后立即移除session中的存储字段避免重复调用:

@app.route('/google/callback')
def google_callback():
    # 此处保留你原有逻辑:授权码校验、拉取用户信息、写入登录态到session
    # --- 原有逻辑省略 ---

    # 跳转处理逻辑
    next_url = session.pop('next_url', None)
    # 同域校验:只允许跳转本站点地址,防止被利用做钓鱼跳转
    if next_url and next_url.startswith(request.host_url):
        return redirect(next_url)
    # 无合法跳转地址时默认走首页
    return redirect('/')

注意事项

  • 不要存储POST请求的地址:用户登录过期时如果触发POST操作,跳转登录后直接访问POST地址会丢失请求参数,这类场景默认跳转首页更合理
  • 同域校验必须保留,否则会存在开放重定向安全风险

内容的提问来源于stack exchange,提问作者grumpycylon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:57:03