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

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

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

    auth.mycompany.work 下没有找到版权信息。
    第 1 条附言  ·  143 天前
    补充下登录流程:
    访问 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  
       143 天前
    我自己设计了一套,目前是采用 oAuth2.0 ,至于同步退出走的消息通知,一个应用退出会通知其他已登录应用同步退出销毁登录态。用 oAuth2.0 可以满足不同域名下的登录,缺点是用户数据同步这块都要额外做逻辑。也可以走传统的直接同域共享 cookie 的方案。
    dudubaba
        2
    dudubaba  
       143 天前
    jwt 呗存缓存,子域名共享 cookie
    xiang0818
        3
    xiang0818  
       143 天前
    内网用最简单的 cookie 同域共享就好了
    edis0n0
        4
    edis0n0  
    OP
       143 天前
    @dudubaba #2
    @xiang0818 #3

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

    看起来像是 #1 提到的 oauth
    edis0n0
        5
    edis0n0  
    OP
       143 天前
    访问 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  
       143 天前
    单点退出有一种方案是各个系统提供一个回调,单点后台调用,cas 就是
    moliliang
        7
    moliliang  
       143 天前
    企业微信 应用之类就好啦~
    nothingistrue
        8
    nothingistrue  
       143 天前
    @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  
       143 天前
    XhstormR02
        10
    XhstormR02  
       143 天前 via Android
    keycloak
    nothingistrue
        11
    nothingistrue  
       143 天前
    我能想到的一个方案是,给令牌设计一个特定的字段,比如授权时间。服务器通过 Redis 等缓存,设计一份全服务可用的“用户 ID—允许的最早授权时间”的键值对数据。 鉴权服务器( auth.mycompany.work )每次令牌发放,都以当前时间设置令牌的授权时间。 业务服务器( nextcloud.mycompany.work ),每次令牌验证,额外验证令牌的授权时间是否大于缓存中获取的“允许的最早授权时间”。任意一个服务登出时,以当前时间更新缓存中的“允许的最早授权时间”。
    akira
        12
    akira  
       143 天前
    首先你要有个账号中心吧。然后就是看你用到的各家产品都支持啥认证了
    0703wzq
        13
    0703wzq  
       143 天前
    @nothingistrue 我这边设计了 2 种形式:
    1:被动式,应用提供一个接口等待被调用用于销毁登录态(支持 2 种方式 api 或后台进程监听通知事件)
    2:主动式,应用会定期请求登录门户 api ,检查当前令牌是否失效,这个时间我目前设置为 2 分钟。

    基于这两种方式,实现某一应用退出,由登录门户通知其他应用,如这个通知失败有尝试机制,如再失败则有主动式最迟 2 分钟的保底使应用退出。
    jackma0571
        14
    jackma0571  
       143 天前
    SSO?
    Kontinue
        15
    Kontinue  
       143 天前
    ldap?
    tinybaby365
        16
    tinybaby365  
       143 天前
    先用 ldap server ,apache ds 这类的软件建一个最核心的账号中心。
    一部分软件可以直接使用 ldap 集成登录,如:gitlab ,jenkins ,svn 等。
    然后你围绕这个核心的账号中心,开发搭建其他协议的接入登录系统,如:oauth ,saml 等。

    也可以不遵循任何标准。如可以用 jwt 方案,通过浏览器 post 给业务系统登录(生成 jwt 的站点放在内网,外网业务系统不直接连接账号中心)

    不建议 jwt 放在共享的 cookie 里面(虽然方便,但安全系统降低了)

    要提升 jwt 的安全性:各个业务系统不能共享密钥,有时间限制(有效时间不能太长,明确的时间范围),有额外的吊销机制。
    novolunt
        17
    novolunt  
       143 天前
    一样 ldap
    skies457
        18
    skies457  
       143 天前 via iPhone
    可以直接用 gitlab 来 oauth2 验证
    BQsummer
        19
    BQsummer  
       143 天前
    keyclock
    linshuizhaoying
        20
    linshuizhaoying  
       143 天前
    基本都 oauth 目前做法后端实现逻辑 前端这边有需要 sso 展示的做法都是直接做 iframe 加载 因为很多产品以后是别的公司的
    leo108
        21
    leo108  
       143 天前
    要支持同步登出的话可选范围不多,OAuth 应该是不支持的,可以看看 SAML 或者 CAS ,支持 SAML 的程序多一些,不过大多数都把 SAML 放在付费支持里。
    billly
        22
    billly  
       143 天前
    CAS
    ZSeptember
        23
    ZSeptember  
       143 天前
    很多开源的,keyclock 或者 CAS
    lologame
        24
    lologame  
       143 天前
    cas, oidc
    fkdog
        25
    fkdog  
       143 天前
    lua cas 。
    应用端什么接口都不用对接,直接从 header 里拿 token 就好了,。
    qile1
        26
    qile1  
       143 天前 via Android
    登录时候 iframe 设置各个系统 token ,退出时候在设置一下失效 exe 程序就得改程序了吧
    hoshan185
        27
    hoshan185  
       143 天前
    我们公司用的是 ldap
    wooyuntest
        28
    wooyuntest  
       143 天前
    keyclock + yubikey
    soupu626
        29
    soupu626  
       143 天前
    和你的问题应该不一样,但是我想到的是,如果都是内部服务的话,可以搞个泛域名,指向网关,然后网关来搞定登陆鉴权,再转发给各个服务,各个服务直接从上下文里取用户信息就行,这样可以搞成一次登陆都登陆,一次退出都退出
    mmdsun
        30
    mmdsun  
       143 天前 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  
       143 天前
    https://docs.authing.cn/v2/concepts/single-sign-on-and-single-sign-out.html ,愿意花钱就去买 Authing 的服务,不愿意花钱就参考 Authing 的登录,登出实现。 场景比你想得还全面。
    Casbin
        32
    Casbin  
       143 天前
    可以试试单点登录平台 Casdoor ,开源,免费商用: https://www.v2ex.com/t/803669
    meshell
        33
    meshell  
       142 天前
    共享 cookie 设置 cookie 的时候域设置成这个 .mycompany.work 把 session 信息放到 redis 里面
    julyclyde
        34
    julyclyde  
       142 天前
    ldap 只是认证
    授权、退出不合适用裸的 ldap 直接做
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   393 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 19:48 · PVG 03:48 · LAX 11:48 · JFK 14:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.