1
0703wzq 2022-09-13 14:04:10 +08:00
我自己设计了一套,目前是采用 oAuth2.0 ,至于同步退出走的消息通知,一个应用退出会通知其他已登录应用同步退出销毁登录态。用 oAuth2.0 可以满足不同域名下的登录,缺点是用户数据同步这块都要额外做逻辑。也可以走传统的直接同域共享 cookie 的方案。
|
2
dudubaba 2022-09-13 14:09:41 +08:00
jwt 呗存缓存,子域名共享 cookie
|
3
xiang0818 2022-09-13 14:10:03 +08:00
内网用最简单的 cookie 同域共享就好了
|
4
edis0n0 OP |
5
edis0n0 OP 访问 nextcloud.mycompany.work 会跳转到 https://auth.mycompany.work/Auth?returnUrl=https://nextcloud.mycompany.work 如果 auth 这边有登录状态会在 returnUrl 后面附上 token 跳转回去完成登录。单点登出是直接跳转到 https://auth.mycompany.work/Signout?t=202209130900 ,没有设置 cookies 操作就全局登出了,没看懂怎么实现的。
|
6
mosakashaka 2022-09-13 14:25:39 +08:00
单点退出有一种方案是各个系统提供一个回调,单点后台调用,cas 就是
|
7
moliliang 2022-09-13 14:50:09 +08:00
企业微信 应用之类就好啦~
|
8
nothingistrue 2022-09-13 14:57:24 +08:00
@edis0n0 #5 这个就是 OAuth2 或者类似的过程。
这里面有两次重定向。 第一次重定向,访问 nextcloud.mycompany.work 发现没有登录,它给你重定向到 auth.mycompany.work 。重定向之后的过程就是本地浏览器根 auth.mycompany.work 的通信过程了,如果是标准的 OAuth2 , 每个来源网站的首次登录都会蹦出一个界面让用户同意授权,这里大概率会略去或者隐藏这个过程。 第二次重定向,当浏览器跟 auth.mycompany.work 完成认证授权过程之后,auth.mycompany.work 指示浏览器重定向回之前的 nextcloud.mycompany.work ,并附上 token 。然后,nextcloud.mycompany.work 再指示浏览器通过 LocalStorage 或者 Cookie 保存令牌。令牌保存之后,后面的过程就跟常规的令牌认证过程没区别了。 如果是标准的 OAuth2 且不使用简单模式,在两次重定向之间,会有一个授权代码换访问令牌的过程,不过单点登录过程可以不要这个步骤。 一退全退这个,光凭 OAuth2 就办不到了,上面有人说的“一个应用退出会通知其他已登录应用”的方案也不可行,因为令牌认证模式不是会话认证模式,服务器没法单方面登出。服务器需要借助一些其他手段,能够让令牌集中失效才行。 |
9
varrily 2022-09-13 15:02:15 +08:00
|
10
XhstormR02 2022-09-13 15:04:16 +08:00 via Android
keycloak
|
11
nothingistrue 2022-09-13 15:07:23 +08:00
我能想到的一个方案是,给令牌设计一个特定的字段,比如授权时间。服务器通过 Redis 等缓存,设计一份全服务可用的“用户 ID—允许的最早授权时间”的键值对数据。 鉴权服务器( auth.mycompany.work )每次令牌发放,都以当前时间设置令牌的授权时间。 业务服务器( nextcloud.mycompany.work ),每次令牌验证,额外验证令牌的授权时间是否大于缓存中获取的“允许的最早授权时间”。任意一个服务登出时,以当前时间更新缓存中的“允许的最早授权时间”。
|
12
akira 2022-09-13 15:10:16 +08:00
首先你要有个账号中心吧。然后就是看你用到的各家产品都支持啥认证了
|
13
0703wzq 2022-09-13 15:20:21 +08:00
@nothingistrue 我这边设计了 2 种形式:
1:被动式,应用提供一个接口等待被调用用于销毁登录态(支持 2 种方式 api 或后台进程监听通知事件) 2:主动式,应用会定期请求登录门户 api ,检查当前令牌是否失效,这个时间我目前设置为 2 分钟。 基于这两种方式,实现某一应用退出,由登录门户通知其他应用,如这个通知失败有尝试机制,如再失败则有主动式最迟 2 分钟的保底使应用退出。 |
14
jackma0571 2022-09-13 15:32:30 +08:00
SSO?
|
15
Kontinue 2022-09-13 15:37:13 +08:00
ldap?
|
16
tinybaby365 2022-09-13 15:44:10 +08:00
先用 ldap server ,apache ds 这类的软件建一个最核心的账号中心。
一部分软件可以直接使用 ldap 集成登录,如:gitlab ,jenkins ,svn 等。 然后你围绕这个核心的账号中心,开发搭建其他协议的接入登录系统,如:oauth ,saml 等。 也可以不遵循任何标准。如可以用 jwt 方案,通过浏览器 post 给业务系统登录(生成 jwt 的站点放在内网,外网业务系统不直接连接账号中心) 不建议 jwt 放在共享的 cookie 里面(虽然方便,但安全系统降低了) 要提升 jwt 的安全性:各个业务系统不能共享密钥,有时间限制(有效时间不能太长,明确的时间范围),有额外的吊销机制。 |
17
novolunt 2022-09-13 15:51:14 +08:00
一样 ldap
|
18
skies457 2022-09-13 16:12:23 +08:00 via iPhone
可以直接用 gitlab 来 oauth2 验证
|
19
BQsummer 2022-09-13 17:20:06 +08:00
keyclock
|
20
linshuizhaoying 2022-09-13 17:23:57 +08:00
基本都 oauth 目前做法后端实现逻辑 前端这边有需要 sso 展示的做法都是直接做 iframe 加载 因为很多产品以后是别的公司的
|
21
leo108 2022-09-13 17:25:21 +08:00
要支持同步登出的话可选范围不多,OAuth 应该是不支持的,可以看看 SAML 或者 CAS ,支持 SAML 的程序多一些,不过大多数都把 SAML 放在付费支持里。
|
22
billly 2022-09-13 18:28:50 +08:00
CAS
|
23
ZSeptember 2022-09-13 18:38:18 +08:00
很多开源的,keyclock 或者 CAS
|
24
lologame 2022-09-13 19:48:01 +08:00
cas, oidc
|
25
fkdog 2022-09-13 19:51:38 +08:00
lua cas 。
应用端什么接口都不用对接,直接从 header 里拿 token 就好了,。 |
26
qile1 2022-09-13 20:14:54 +08:00 via Android
登录时候 iframe 设置各个系统 token ,退出时候在设置一下失效 exe 程序就得改程序了吧
|
27
hoshan185 2022-09-13 21:15:20 +08:00
我们公司用的是 ldap
|
28
wooyuntest 2022-09-13 21:22:29 +08:00
keyclock + yubikey
|
29
soupu626 2022-09-13 21:36:33 +08:00
和你的问题应该不一样,但是我想到的是,如果都是内部服务的话,可以搞个泛域名,指向网关,然后网关来搞定登陆鉴权,再转发给各个服务,各个服务直接从上下文里取用户信息就行,这样可以搞成一次登陆都登陆,一次退出都退出
|
30
mmdsun 2022-09-13 23:08:41 +08:00 via iPhone
直接用 spring session redis 就好,傻瓜式集成。
前端传 token 请求头,还可以踢人。不像 JWT 没有状态。 https://docs.spring.io/spring-session/docs/2.4.6/reference/html5/guides/java-rest.html#servlet-container-initialization |
31
yufeng0681 2022-09-13 23:53:34 +08:00
https://docs.authing.cn/v2/concepts/single-sign-on-and-single-sign-out.html ,愿意花钱就去买 Authing 的服务,不愿意花钱就参考 Authing 的登录,登出实现。 场景比你想得还全面。
|
32
Casbin 2022-09-14 00:07:32 +08:00
可以试试单点登录平台 Casdoor ,开源,免费商用: https://www.v2ex.com/t/803669
|
33
meshell 2022-09-14 09:25:35 +08:00
共享 cookie 设置 cookie 的时候域设置成这个 .mycompany.work 把 session 信息放到 redis 里面
|
34
julyclyde 2022-09-14 13:00:02 +08:00
ldap 只是认证
授权、退出不合适用裸的 ldap 直接做 |