Flask 配置 session 和 cookie 的过期时间

2018-05-02 09:30:03 +08:00
 mzmxcvbn

现在要实现两个功能:
1.用户关掉浏览器后,2 个小时之内再打开,可以不用再登录。
2.用户登录后,停在页面 1 个小时不操作,则强制登出。

我现在用的是 Flask-login,用了 login_user()的 remember me 功能,并在 config 里配置了 REMEMBER_COOKIE_DURATION = timedelta(hours=2)。我原以为这一步只能实现第一个功能。

后来我又谷歌了半天,很多都说要配置 session 以实现第二个功能:
在 login 的视图函数中:
session.permanent = True
app.permanent_session_lifetime = timedelta(hours=1)

可是我发现 cookie 这个 2 小时过期是已经实现了,但第二个功能好像并没有实现

我的问题是:
1.如果我两个功能要求的过期时间一样,只配置 cookie 过期时间,能同时实现两个功能吗。
2.如果是我现在要实现的这两个功能,我配置的问题出在哪里。

7139 次点击
所在节点    Python
8 条回复
PressOne
2018-05-02 09:42:32 +08:00
第二个功能,要每次请求之后,通过 js 定时请求,才能判断是不是过期。每次新请求之后,刷新这个 js 定时器就可以了
guiqiqi
2018-05-02 09:48:44 +08:00
没有用过 flask-login,但是自己写了一套基于 flask 的用户和权限系统,cookie 的有效时间可以在返回的 response 中使用 set_cookie 来设置,其中的第三个参数是有效时间;
在你的问题里面,如果两个时间相同,配置这个就足够了(例如将过期时间配置成 2h );
如果非要让用户在 1h 之内没有任何操作就要登出的话我给你一个思路:加载完毕页面之后前端 setInterval(1h),给后端发一个登出的 ajax 请求,后段返回的请求带上作废 cookie 的请求给浏览器,ajax 完了之后弹个框通知用户已被登出。
当然这只是一个思路,希望能帮到你。
mzmxcvbn
2018-05-02 10:02:07 +08:00
@guiqiqi 谢谢回复,我想问一下 session.permanent = True
app.permanent_session_lifetime = timedelta(hours=1)这几个配置是在什么情况下用到的呢
guiqiqi
2018-05-02 18:48:37 +08:00
@mzmxcvbn #3
官方文档中就有说明:启用 permanent 之后 session lifetime 才会被应用,否则 session 在浏览器关闭时过期(在浏览器端就是 cookies 过期);
建议多看官方文档。
mzmxcvbn
2018-05-03 11:16:39 +08:00
@guiqiqi 我设置了呀 session.permanent = True
lfzyx
2018-10-20 13:50:59 +08:00
第二个功能,如果是为了安全,那你用 js 完全没有意义,通过修改 js 发送的数据,就可以骗过服务端。
正确的做法是用户每次点击 url 后,都在数据库的用户表里更新时间戳,这样下一次点击 url 就可以对比了
polar9527
2019-04-18 18:53:32 +08:00
我的理解是这两个功能有冲突,当你这样配置好后,在第二个功能中 1 个小时后虽然“ session ”这个 cookie 失效了,但是,flask_login 还是会从名叫“ remember_token ”的 cookie 中将用户登录信息重新载入到名叫“ session ”的 cookie 中。具体源码可以看一下 flask_login.login_manager._load_user 这个函数
polar9527
2019-04-18 18:55:27 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/451336

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX