【问题标题】:Manage token life duration with SimpleCookie in Python在 Python 中使用 SimpleCookie 管理令牌生命周期
【发布时间】:2023-12-21 15:18:01
【问题描述】:

已经让令牌正常工作,这是这样设置的:

session_cookie = SimpleCookie()
session_cookie['key'] = any_string_value
session_cookie['key']["Path"] = '/'

headers = []
headers.extend(("set-cookie", morsel.OutputString())
    for morsel
    in session_cookie.values())

start_response(status, headers)

我还能够读取令牌并提取我需要的信息:

# Get cookies
cookies = request.get_cookies()
#     Get current token from cookies
token   = cookies['token'].value

现在,设置 cookie 过期的最佳方法是什么,我知道有 2 个可能的键:

  1. session_cookie['key']['max-age'] = "以秒为单位的时间"
  2. session_cookie['key']['expiration'] = "未来的日期"

我如何知道令牌是否已过期或者管理过期令牌的最佳方法是什么?

非常感谢!

【问题讨论】:

  • 这是来自 ?只是问...
  • token是格式化的字符串,包含user_id等信息。
  • 啊普通令牌。我虽然这是 django 特有的东西。
  • 与django、python中的普通WSGI和使用Cookie.SimpleCookie无关
  • prefer expires 因为 IE 不支持 max age

标签: python cookies wsgi


【解决方案1】:

当你尝试获取令牌时,如果令牌不存在,你可以知道令牌是否已过期。

token   = cookies['token'].value #this will not exist

浏览器会在过期日期时删除 cookie 以及与之相关的所有内容。

在许多实现中,您甚至可以删除 cookie 或例如注销用户,但将 user_id cookie 的到期日期设置为过去的某个值(例如负数)。

现在据我了解,您需要一个策略来检测过期令牌服务器端,这可以通过双重验证来完成。例如,尝试为每个令牌存储一个唯一标识符,当您读取令牌时,服务器端尝试检查它是否已过期。用户也可以操纵他的 cookie,因此永远不要盲目相信 cookie 来存储重要数据或使任何 user_id 进行简单验证。

希望我能帮上忙。

编辑

来自rfc2109

Max-Age=delta-seconds 可选的。 Max-Age 属性定义了 饼干,以秒为单位。 delta-seconds 值是十进制的非 负整数。经过 delta-seconds 秒后,客户端 应该丢弃 cookie。零值表示 cookie 应立即丢弃。

来自wiki http cookies

Expires 指令告诉浏览器何时删除 cookie。 源自 RFC 1123 中使用的格式,日期在 “Wdy, DD Mon YYYY HH:MM:SS GMT”的形式,[29] 表示确切的 此 cookie 到期的日期/时间。作为设置 cookie 的替代方法 到期作为绝对日期/时间,RFC 6265 允许使用 Max-Age 属性将 cookie 的过期时间设置为 未来的秒数,相对于浏览器接收到的时间 饼干。

我建议使用 max-age,因为这样可以省去设置日期等方面的麻烦。您只需计算一个间隔。

阅读更多我发现 IE

Max-Age vs Expires

这应该会有所帮助;-)

【讨论】:

  • 谢谢,我的问题仍然是,我没有解释这一点是我的错误,每次用户登录时,它都会收到一个新的令牌。
  • 但是您想实现什么,请解释一下您的目标或您的用户案例场景...... .
  • @Jimme Kane - 我想他在问如何设置令牌的到期日期。