Flask中如何向重定向URL的请求头传递JWT令牌?
Flask 注册后传递JWT到订单页的安全实现方案
首先明确核心限制:Flask的redirect()本质是返回3xx状态码+Location响应头,后续跳转请求由浏览器自动发起,HTTP协议层面不支持服务端在这类自动跳转请求中注入自定义请求头,因此无法直接通过原生重定向实现「把JWT放在请求头传给订单页」的效果,以下是两种生产环境可用的落地方案:
方案1:HttpOnly安全Cookie传递JWT(服务端渲染架构首选,改动最小)
这是最适配传统服务端渲染Flask应用的方案,不需要额外写前端逻辑,安全性远高于URL传参:
- 注册成功生成JWT后,不把token拼在URL里,而是通过
Set-Cookie响应头把JWT写入安全Cookie - 浏览器后续访问订单页时会自动在请求头的Cookie字段携带这个token,订单页直接从Cookie取值校验即可
- 配置Cookie的安全属性,避免token被XSS、CSRF攻击窃取,也不会出现在URL、浏览器历史、服务器访问日志、Referer头中
示例代码:
# 先修复原有代码的高危bug # 1. SQL执行必须用参数化查询,禁止用format拼接,避免SQL注入 # 错误写法:cursor.execute(INSERT_NEW_CUSTOMER_QUERY.format(...)) # 正确写法示例:cursor.execute(INSERT_NEW_CUSTOMER_QUERY, (cid, hashed_passwd)) # 2. JWT的exp字段必须是数值型时间戳,不要转字符串,否则过期校验失效 payload = { 'cid': cid, 'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30) } token = jwt.encode(payload, SECRET, algorithm='HS256') # 构造带安全Cookie的重定向响应 resp = make_response(redirect("/order")) resp.set_cookie( key="access_token", value=token, max_age=30*60, # 和JWT30分钟有效期对齐 httponly=True, # 禁止前端JS读取Cookie,防XSS窃取 secure=True, # 生产环境HTTPS下开启,仅允许HTTPS连接传输Cookie samesite="Lax", # 防跨站CSRF攻击 path="/order" # 仅访问/order路径时才携带该Cookie,遵循最小权限原则 ) return resp
订单页鉴权时直接从Cookie取token即可:
from flask import request token = request.cookies.get("access_token") # 后续执行JWT验签、解析逻辑即可
方案2:响应体返回JWT,前端携带请求头跳转(前后端分离架构首选)
如果你的应用是前后端分离架构,不要用服务端重定向,注册接口直接返回200响应把JWT放在响应体里,由前端控制跳转和请求头注入:
- 注册接口逻辑调整:
# 注册成功、生成token后,不返回重定向,直接返回JSON响应 return { "code": 0, "msg": "注册成功", "data": { "access_token": token, "redirect": "/order" } }, 200
- 前端拿到响应后,把token存在内存中,跳转到订单页时主动在请求头中添加
Authorization: Bearer <token>字段即可,这是前后端分离场景下JWT认证的标准实现方式。
补充:原有代码还有一处异常捕获的bug:
jwt.exceptions是模块名,不能直接跟在except后面,需要捕获具体异常类比如jwt.exceptions.EncodeError,否则异常捕获逻辑不会生效。
内容的提问来源于stack exchange,提问作者Saptarshi Ganguly
相关产品推荐
相关产品推荐

