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
相关产品推荐
相关产品推荐

