V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
edis0n0
V2EX  ›  程序员

内网多产品单点登录一般用的是什么方案?

  •  
  •   edis0n0 · 2022-09-13 13:57:11 +08:00 · 5285 次点击
    这是一个创建于 788 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如在 auth.mycompany.work 登录后 gitlab.mycompany.work nextcloud.mycompany.work oa.mycompany.work 全都自动登录了,只要在一个服务登出全部的服务都登出了,一般用的是什么方案?

    auth.mycompany.work 下没有找到版权信息。
    第 1 条附言  ·  2022-09-13 20:21:54 +08:00
    补充下登录流程:
    访问 nextcloud.mycompany.work 会跳转到 https://auth.mycompany.work/Auth?returnUrl=https://nextcloud.mycompany.work 如果 auth 这边有登录状态会在 returnUrl 后面附上 token 跳转回去完成登录。单点登出是直接跳转到 https://auth.mycompany.work/Signout?t=202209130900 ,没有设置 cookies 操作就全局登出了,没看懂怎么实现的。
    34 条回复    2022-09-14 13:00:02 +08:00
    0703wzq
        1
    0703wzq  
       2022-09-13 14:04:10 +08:00
    我自己设计了一套,目前是采用 oAuth2.0 ,至于同步退出走的消息通知,一个应用退出会通知其他已登录应用同步退出销毁登录态。用 oAuth2.0 可以满足不同域名下的登录,缺点是用户数据同步这块都要额外做逻辑。也可以走传统的直接同域共享 cookie 的方案。
    dudubaba
        2
    dudubaba  
       2022-09-13 14:09:41 +08:00
    jwt 呗存缓存,子域名共享 cookie
    xiang0818
        3
    xiang0818  
       2022-09-13 14:10:03 +08:00
    内网用最简单的 cookie 同域共享就好了
    edis0n0
        4
    edis0n0  
    OP
       2022-09-13 14:12:44 +08:00
    @dudubaba #2
    @xiang0818 #3

    nextcloud gitlab 这些都不是我们公司的产品,共享 cookie 是不是要用什么插件?(直接改代码不太可能吧,后续更新之类的都不方便)

    看起来像是 #1 提到的 oauth
    edis0n0
        5
    edis0n0  
    OP
       2022-09-13 14:21:49 +08:00
    访问 nextcloud.mycompany.work 会跳转到 https://auth.mycompany.work/Auth?returnUrl=https://nextcloud.mycompany.work 如果 auth 这边有登录状态会在 returnUrl 后面附上 token 跳转回去完成登录。单点登出是直接跳转到 https://auth.mycompany.work/Signout?t=202209130900 ,没有设置 cookies 操作就全局登出了,没看懂怎么实现的。
    mosakashaka
        6
    mosakashaka  
       2022-09-13 14:25:39 +08:00
    单点退出有一种方案是各个系统提供一个回调,单点后台调用,cas 就是
    moliliang
        7
    moliliang  
       2022-09-13 14:50:09 +08:00
    企业微信 应用之类就好啦~
    nothingistrue
        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 就办不到了,上面有人说的“一个应用退出会通知其他已登录应用”的方案也不可行,因为令牌认证模式不是会话认证模式,服务器没法单方面登出。服务器需要借助一些其他手段,能够让令牌集中失效才行。
    varrily
        9
    varrily  
       2022-09-13 15:02:15 +08:00
    XhstormR02
        10
    XhstormR02  
       2022-09-13 15:04:16 +08:00 via Android
    keycloak
    nothingistrue
        11
    nothingistrue  
       2022-09-13 15:07:23 +08:00
    我能想到的一个方案是,给令牌设计一个特定的字段,比如授权时间。服务器通过 Redis 等缓存,设计一份全服务可用的“用户 ID—允许的最早授权时间”的键值对数据。 鉴权服务器( auth.mycompany.work )每次令牌发放,都以当前时间设置令牌的授权时间。 业务服务器( nextcloud.mycompany.work ),每次令牌验证,额外验证令牌的授权时间是否大于缓存中获取的“允许的最早授权时间”。任意一个服务登出时,以当前时间更新缓存中的“允许的最早授权时间”。
    akira
        12
    akira  
       2022-09-13 15:10:16 +08:00
    首先你要有个账号中心吧。然后就是看你用到的各家产品都支持啥认证了
    0703wzq
        13
    0703wzq  
       2022-09-13 15:20:21 +08:00
    @nothingistrue 我这边设计了 2 种形式:
    1:被动式,应用提供一个接口等待被调用用于销毁登录态(支持 2 种方式 api 或后台进程监听通知事件)
    2:主动式,应用会定期请求登录门户 api ,检查当前令牌是否失效,这个时间我目前设置为 2 分钟。

    基于这两种方式,实现某一应用退出,由登录门户通知其他应用,如这个通知失败有尝试机制,如再失败则有主动式最迟 2 分钟的保底使应用退出。
    jackma0571
        14
    jackma0571  
       2022-09-13 15:32:30 +08:00
    SSO?
    Kontinue
        15
    Kontinue  
       2022-09-13 15:37:13 +08:00
    ldap?
    tinybaby365
        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 的安全性:各个业务系统不能共享密钥,有时间限制(有效时间不能太长,明确的时间范围),有额外的吊销机制。
    novolunt
        17
    novolunt  
       2022-09-13 15:51:14 +08:00
    一样 ldap
    skies457
        18
    skies457  
       2022-09-13 16:12:23 +08:00 via iPhone
    可以直接用 gitlab 来 oauth2 验证
    BQsummer
        19
    BQsummer  
       2022-09-13 17:20:06 +08:00
    keyclock
    linshuizhaoying
        20
    linshuizhaoying  
       2022-09-13 17:23:57 +08:00
    基本都 oauth 目前做法后端实现逻辑 前端这边有需要 sso 展示的做法都是直接做 iframe 加载 因为很多产品以后是别的公司的
    leo108
        21
    leo108  
       2022-09-13 17:25:21 +08:00
    要支持同步登出的话可选范围不多,OAuth 应该是不支持的,可以看看 SAML 或者 CAS ,支持 SAML 的程序多一些,不过大多数都把 SAML 放在付费支持里。
    billly
        22
    billly  
       2022-09-13 18:28:50 +08:00
    CAS
    ZSeptember
        23
    ZSeptember  
       2022-09-13 18:38:18 +08:00
    很多开源的,keyclock 或者 CAS
    lologame
        24
    lologame  
       2022-09-13 19:48:01 +08:00
    cas, oidc
    fkdog
        25
    fkdog  
       2022-09-13 19:51:38 +08:00
    lua cas 。
    应用端什么接口都不用对接,直接从 header 里拿 token 就好了,。
    qile1
        26
    qile1  
       2022-09-13 20:14:54 +08:00 via Android
    登录时候 iframe 设置各个系统 token ,退出时候在设置一下失效 exe 程序就得改程序了吧
    hoshan185
        27
    hoshan185  
       2022-09-13 21:15:20 +08:00
    我们公司用的是 ldap
    wooyuntest
        28
    wooyuntest  
       2022-09-13 21:22:29 +08:00
    keyclock + yubikey
    soupu626
        29
    soupu626  
       2022-09-13 21:36:33 +08:00
    和你的问题应该不一样,但是我想到的是,如果都是内部服务的话,可以搞个泛域名,指向网关,然后网关来搞定登陆鉴权,再转发给各个服务,各个服务直接从上下文里取用户信息就行,这样可以搞成一次登陆都登陆,一次退出都退出
    mmdsun
        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
    yufeng0681
        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 的登录,登出实现。 场景比你想得还全面。
    Casbin
        32
    Casbin  
       2022-09-14 00:07:32 +08:00
    可以试试单点登录平台 Casdoor ,开源,免费商用: https://www.v2ex.com/t/803669
    meshell
        33
    meshell  
       2022-09-14 09:25:35 +08:00
    共享 cookie 设置 cookie 的时候域设置成这个 .mycompany.work 把 session 信息放到 redis 里面
    julyclyde
        34
    julyclyde  
       2022-09-14 13:00:02 +08:00
    ldap 只是认证
    授权、退出不合适用裸的 ldap 直接做
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1446 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:27 · PVG 01:27 · LAX 09:27 · JFK 12:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.