我正在从后端的 cookie 中设置 JWT 令牌,并且第一次就设置正确。但是,当刷新页面时,cookie 会自动从浏览器中删除。
任何人都可以帮助我理解为什么 cookie 在刷新后消失以及如何解决这个问题? 这是代码
response.set_cookie(
key='auth_token',
value=token,
domain='http://localhost:3000',
expires=expires_str,
secure=False,
httponly=False,
samesite='None',
)
我尝试了设置 cookie 时传递的不同参数,但没有一个起作用。
在 Web 应用程序中处理 cookie 时,尤其是使用 JWT 令牌进行身份验证时,有几个重要方面需要考虑。根据您提供的代码片段和您面临的问题,以下是 Cookie 在页面刷新后可能消失的一些潜在原因,以及解决该问题的解决方案。
问题与解决方案
domain
属性不应包含协议(http
或https
)。它应该只是域名。如果您在 localhost
上运行后端,则应将域设置为 localhost
,而不使用方案。 response.set_cookie(
key='auth_token',
value=token,
domain='localhost', # Corrected the domain
expires=expires_str,
secure=False,
httponly=False,
samesite='None',
)
SameSite=None
设置 cookie,请确保在使用 HTTPS 时使用 secure=True
。如果您在 http
上进行测试,则可能需要将 samesite
设置为 'Lax'
或 'Strict'
。 response.set_cookie(
key='auth_token',
value=token,
domain='localhost',
expires=expires_str,
secure=False, # Only use True if you're on HTTPS
httponly=False,
samesite='Lax', # Change from 'None' to 'Lax' for HTTP
)
修复:确保expires_str设置为未来的日期。以下是如何在 Python 中正确设置它的示例:
from datetime import datetime, timedelta
expires = datetime.utcnow() + timedelta(days=7) # Set expiration for 7 days
expires_str = expires.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
前端处理:确保您的前端不会在刷新时清除 cookie。有时,前端框架或库可能有自己的管理 cookie 的逻辑。
浏览器设置:检查浏览器设置以确保启用 cookie。有时,隐私设置或扩展程序可能会阻止 cookie。
完整代码示例
以下是您可能希望根据上述考虑因素构建代码的方式:
from datetime import datetime, timedelta
from flask import Flask, make_response
app = Flask(__name__)
@app.route('/set_token')
def set_token():
token = "your_jwt_token_here" # Replace with your actual token
expires = datetime.utcnow() + timedelta(days=7) # Set expiration for 7 days
expires_str = expires.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
response = make_response("Token set in cookie")
response.set_cookie(
key='auth_token',
value=token,
domain='localhost', # Corrected domain
expires=expires_str,
secure=False, # Set to True if using HTTPS
httponly=False,
samesite='Lax', # Change to 'Lax' for testing on HTTP
)
return response
if __name__ == "__main__":
app.run(port=5000)