求教个前端登录功能实现思路

2023-01-31 19:01:28 +08:00
 iapplebear

产品提了个奇葩需求,暂时没好的解决方案求助下大家。 官网:a.xxx.com ,控制台:a-admin.xxx.com 。需要在官网登录后控制台也保持登录状态(这块以前种 cookie 能实现),现在产品的需求是官网或控制台页面(都是 React 单页面,前提都是登录状态),关闭浏览器算退出登录,同时关闭官网和控制台 2 个 tab 也算退出登录,但是只要官网和控制台有一个 tab 在就算登录状态,有点麻了。。

2391 次点击
所在节点    程序员
25 条回复
MuscleOf2016
2023-01-31 19:16:00 +08:00
cookie + session ?
damngoto
2023-01-31 19:19:29 +08:00
我建议揍 TA 一顿
learningman
2023-01-31 19:31:28 +08:00
换 jwt 类似的带状态的 session ,每个页面都定期轮询确保 session 有效,一段时间没轮询就注销掉这个 session 。
这样只要有任意一个页面开着就能有效。
dusu
2023-01-31 19:48:58 +08:00
这不是正常需求么?
jwt 写到整个域名下 .xxx.com
前端做个心跳来维持 cookie
klo424
2023-01-31 19:53:32 +08:00
需要后端配合吧。

前端 30s 一心跳维持 cookie ,后端接收心跳与前一次心跳比较,时差超过 1min 就告诉前端掉线。
soupu626
2023-01-31 20:00:30 +08:00
简单想的
后端 session 过期时间设置短一点,比如 10 秒,然后前端 3 秒心跳保活刷新过期时间?
moxxun
2023-01-31 20:51:02 +08:00
试试 window.postMessage
KuroNekoFan
2023-01-31 20:53:37 +08:00
postMessage 加 sessionStorage 咯....
cpstar
2023-01-31 21:28:08 +08:00
除了被动轮询,这不太可能啊,两个 tab 直接不可能通信,一个 tab 关了它怎么知道还有别的 tab 在。

除非。。。
每次请求都刷新一次后台的 session ,每次关闭 tab 或者窗口(onunload)都向后台告知退出了。然后后台来判定这个上一次报告的退出和下一次的请求是否是曾经的某个同一次登录。如果两个域在不同的容器里,再互通一下有无吧。
gausszhou
2023-01-31 21:50:54 +08:00
> 同时关闭官网和控制台 2 个 tab 也算退出登录
这需求....
InoriLover
2023-01-31 22:14:38 +08:00
services worker
sw 来管凭据,tab 都关的话 sw 就没了
Lukedis
2023-01-31 22:30:06 +08:00
域名共享 token,后端 token+redis,tap 关闭告诉后端 tap 关闭,两个 tap 都是关闭状态,直接让 token 失效
wingkwanli888
2023-01-31 22:53:57 +08:00
Postmessage

情境一,先开了官网 Tab, 登录了官网后,用户再开一个新的 tab 打开控制台,控制台 tab 每次一刷新就 postmessage 问隔壁的官 tab 获取 token

情境二,同时打开两个 tab, 全意一个 tab 登录后,postmessage 到另外一个 tab
putyy
2023-02-01 09:16:53 +08:00
cookie 存储 token *.xxx.com 同域 没记错的话应该可以读取到
putyy
2023-02-01 09:30:18 +08:00
看错了,如果要保持两个共享登录状态的话,任意端登录先重定向到另一端确定对端是否登录,如果登录就共享对端的 token, 如果对端没有登录那就执行登录 token 存放在本端 sessionStore ,如果后面增加其他子域名,可以做一个单独的中间页来存放 token ,其他端对登录都重定向到这个页面确定登录、登录成功也进行存储到中间页,重定向应该可以用影藏的 iframe 来代替,,好久没写了 不过你可以试试
iapplebear
2023-02-01 10:17:47 +08:00
谢谢各位,我认真看下各位的实现
summerLast
2023-02-01 10:20:40 +08:00
这个也简单,每个页面 sessionStorage 存一个 自己的 token ,token 是有时长的
iapplebear
2023-02-01 10:33:09 +08:00
@dusu 恐怕不行,不能和其他业务子域名有交集,每天数亿的请求
dawnsw
2023-02-01 11:08:30 +08:00
试试 jwt + sessionStoroage + messageChannel(共享 jwt)
PEax
2023-02-01 11:23:56 +08:00
[关闭浏览器算退出登录,同时关闭官网和控制台 2 个 tab 也算退出登录,但是只要官网和控制台有一个 tab 在就算登录状态] 能不能简单理解为,只要任意一个保持心跳就可以了? 存储同域的 cookie ( xxx.domain.com ),然后官网跟控制台都添加心跳 ?

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

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

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

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

© 2021 V2EX