Cookie 中设置的 JWT 令牌会在页面刷新时被删除

问题描述 投票:0回答:1

我正在从后端的 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 时传递的不同参数,但没有一个起作用。

python reactjs cookies jwt
1个回答
0
投票

在 Web 应用程序中处理 cookie 时,尤其是使用 JWT 令牌进行身份验证时,有几个重要方面需要考虑。根据您提供的代码片段和您面临的问题,以下是 Cookie 在页面刷新后可能消失的一些潜在原因,以及解决该问题的解决方案。

问题与解决方案

  1. 域属性:
    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',
    )
  1. Path 和 SameSite 属性:如果使用
    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
    )
  1. Cookie 过期时间:确保过期参数设置正确。如果 cookie 在设置后立即过期,则刷新后它将不会保留。

修复:确保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")
  1. 前端处理:确保您的前端不会在刷新时清除 cookie。有时,前端框架或库可能有自己的管理 cookie 的逻辑。

  2. 浏览器设置:检查浏览器设置以确保启用 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)
© www.soinside.com 2019 - 2024. All rights reserved.