dapengzhao
V2EX  ›  问与答

鹅滴神啊,上帝以及老天爷啊,不同域名下,前后端不分离的单点登录该怎么搞啊,我太难了。

  •  
  •   dapengzhao · Dec 18, 2019 · 4434 views
    This topic created in 2361 days ago, the information mentioned may be changed or developed.
    有大佬给个思路就成。
    目前 cookie 的方法因为是不同域下所以不行
    jwt token 的方法因为是不同域所以 token 没法加在 cookie 里面,因为不是前后端分离,所以没法在每次请求的时候加在 header 里面。
    
    27 replies    2020-06-24 16:54:31 +08:00
    s0f
        1
    s0f  
       Dec 18, 2019
    token 可以存在 sessionStorage 或者 localStorage
    dapengzhao
        2
    dapengzhao  
    OP
       Dec 18, 2019
    @s0f 不同域名,不同端口,sessionStorage 或者 localStorage 没法共享,就算可以共享,不是前后端分离,请求的时候也带不上。
    donnior
        3
    donnior  
       Dec 18, 2019
    cookie 不用共享阿,各自一套,验证 token 再服务器端做
    lshero
        4
    lshero  
       Dec 18, 2019
    就模仿一下 oauth 呗,都统一跳转到一个域名下检查登录呗,检查通过带参数回调请求登录的业务方网址,业务方网址校验完参数后写 cookie 呗
    vinHty
        5
    vinHty  
       Dec 18, 2019
    https://juejin.im/post/5a002b536fb9a045132a1727
    看看这个,用一台服务器专门做验证。
    U7Q5tLAex2FI0o0g
        6
    U7Q5tLAex2FI0o0g  
       Dec 18, 2019
    老哥你一个单点登录的问题纠结了 5 天,发了 4 个帖了。。。
    lvxudong
        7
    lvxudong  
       Dec 18, 2019
    OAuth 或者 SAML 都可以啊
    InkAndBanner
        8
    InkAndBanner  
       Dec 18, 2019
    @littleylv 你上来就打楼主嘴巴子?
    dapengzhao
        9
    dapengzhao  
    OP
       Dec 18, 2019
    @InkAndBanner 菜鸟不懂就问,大佬受累了
    acthtml
        10
    acthtml  
       Dec 18, 2019
    做 OAuth2.0 就行
    fancy111
        11
    fancy111  
       Dec 18, 2019
    jwt token 的方法因为是不同域所以 token 没法加在 cookie 里面,因为不是前后端分离,所以没法在每次请求的时候加在 header 里面???
    这句话没一个地方说对了,你再把这两点理解清楚一下吧。
    dapengzhao
        12
    dapengzhao  
    OP
       Dec 18, 2019
    @fancy111 也可能是我理解有问题

    1 ( jwt token 的方法因为是不同域所以 token 没法加在 cookie 里面)是我要做单点登陆的几个网站不是在同一个域名下面,因此没法共享 cookie,也就是说我把登陆 a 网站拿到的 token 放在 cookie 里面,再去登陆 b 网站的时候依然拿不到 token 还是要登陆。

    2 (因为不是前后端分离,所以没法在每次请求的时候加在 header 里面)基于上面的原因,我想把 token 放在请求头里面,每次发请求的时候跟着请求头发过去,但是我们网站不是前后端分离,所以前端的跳转路由基本都是 href='/a/b'类似这种,并不是前后端分离那种请求接口类似这种 url='127.0.0.1:8000/account/'这种的话可以在每次请求的时候添加 token 到 header 里面。如果非要把所有路由改写成 ajax 方式请求成本太大不可能允许这样做。

    额。。。。不知道我说清楚了没有
    fancy111
        13
    fancy111  
       Dec 18, 2019   ❤️ 1
    JWT 本身就是作为跨域来使用的,你先去学习一下 JWT 原理,你连原理都没懂就分析是在浪费时间。
    token 存入 cookie 是后端来交互的,你分别把 token 存在不同的域名 cookie 下就行了,后端获取到 cookie 再到单点登录服务器处理。。。 我字都不想打了,你还是去学习一下吧。
    还有后面的知识,我觉得你应该经验不足。
    dxl314
        14
    dxl314  
       Dec 18, 2019
    cookie 可以存指定域下啊
    hoythan
        15
    hoythan  
       Dec 18, 2019
    a 页面内嵌一个 iframe,
    从 a 访问到 b 域名,b 域名下做一个免登页面,地址栏带上 token,以及一些时间戳加密的验证之类的,然后 b 域名保存这个 token 到 cookie 即可实现无感知的免登。
    hoythan
        16
    hoythan  
       Dec 18, 2019
    同理,b 页面登录的时候也可以生成一个隐藏的 iframe,访问到 a 页面的免登页面,地址栏传递 token 过去。
    dapengzhao
        17
    dapengzhao  
    OP
       Dec 18, 2019
    @fancy111 谢谢回复
    看了很多
    4. JWT 的用法
    客户端接收服务器返回的 JWT,将其存储在 Cookie 或 localStorage 中。

    此后,客户端将在与服务器交互中都会带 JWT。如果将它存储在 Cookie 中,就可以自动发送,但是不会跨域,因此一般是将它放入 HTTP 请求的 Header Authorization 字段中。
    基本都是这么说的,我再多看看吧,可能还是没有理解透。
    EricInBj
        18
    EricInBj  
       Dec 18, 2019
    CAS 了解一下。。。
    unsized
        19
    unsized  
       Dec 18, 2019 via iPhone
    @fancy111 分别把 token 存在不同的域名 cookie 下就行了

    请问下这个如何实现
    walpurgis
        20
    walpurgis  
       Dec 18, 2019 via Android
    标准答案 OAuth2,所有大厂登录系统都用这个方案,它的 RFC 里就是用普通的前后不分离网站做例子的
    jie170601
        21
    jie170601  
       Dec 18, 2019 via Android
    感觉不用共享 cookie,如果 a 是认证中心地址,其他系统每次检测到当前请求未登录,就发重定向给浏览器,浏览器跳转到 a 的地址,会自动带上 a 的 cookie,a 只要判断浏览器传给自己的 cookie 有没有登录过就行了,与其他系统域名的 cookie 无关
    dapengzhao
        22
    dapengzhao  
    OP
       Dec 18, 2019
    @jie170601 '其他系统每次检测到当前请求未登录'这句话就通不过。
    jie170601
        23
    jie170601  
       Dec 18, 2019 via Android
    @dapengzhao 子系统也要维护自己的局部会话,登录了就可以不通过单点登录系统,不然每个请求都去单点登录走一遍?
    glaucus
        24
    glaucus  
       Dec 18, 2019 via iPhone
    最近才做了这个....俩公司的系统做单点登录,建了个账号同步中间件
    fengbjhqs
        25
    fengbjhqs  
       Dec 18, 2019
    @dapengzhao #22 每次打开网站,就判断是否登录,如果没有登录,就跳转到统一的登录地址,这个地址判断以前是否登录,如果登录了就直接跳回来,并附带 jwt,这样就可以了哇,
    bingfengwx
        26
    bingfengwx  
       Dec 18, 2019 via Android
    问过度娘了吗??
    Shikyou
        27
    Shikyou  
       Jun 24, 2020
    这一类实现单点登录的 user pool 云服务已经很多了,为什么还要自行开发呢?
    比如楼上说的国内的 Authing,还有美国的 Auth0 和 AWS Cognito 都行的(国内由于政策原因用不了)。
    用了以后就回不去了,再也无需开发、运维用户系统……
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2446 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 74ms · UTC 00:33 · PVG 08:33 · LAX 17:33 · JFK 20:33
    ♥ Do have faith in what you're doing.