V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dapengzhao
V2EX  ›  问与答

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

  •  
  •   dapengzhao · 2019-12-18 10:27:17 +08:00 · 3322 次点击
    这是一个创建于 1585 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有大佬给个思路就成。
    目前 cookie 的方法因为是不同域下所以不行
    jwt token 的方法因为是不同域所以 token 没法加在 cookie 里面,因为不是前后端分离,所以没法在每次请求的时候加在 header 里面。
    
    27 条回复    2020-06-24 16:54:31 +08:00
    s0f
        1
    s0f  
       2019-12-18 10:29:41 +08:00
    token 可以存在 sessionStorage 或者 localStorage
    dapengzhao
        2
    dapengzhao  
    OP
       2019-12-18 10:44:02 +08:00
    @s0f 不同域名,不同端口,sessionStorage 或者 localStorage 没法共享,就算可以共享,不是前后端分离,请求的时候也带不上。
    donnior
        3
    donnior  
       2019-12-18 10:48:02 +08:00
    cookie 不用共享阿,各自一套,验证 token 再服务器端做
    lshero
        4
    lshero  
       2019-12-18 10:48:24 +08:00
    就模仿一下 oauth 呗,都统一跳转到一个域名下检查登录呗,检查通过带参数回调请求登录的业务方网址,业务方网址校验完参数后写 cookie 呗
    vinHty
        5
    vinHty  
       2019-12-18 10:52:38 +08:00
    https://juejin.im/post/5a002b536fb9a045132a1727
    看看这个,用一台服务器专门做验证。
    littleylv
        6
    littleylv  
       2019-12-18 10:55:42 +08:00
    老哥你一个单点登录的问题纠结了 5 天,发了 4 个帖了。。。
    lvxudong
        7
    lvxudong  
       2019-12-18 12:20:43 +08:00
    OAuth 或者 SAML 都可以啊
    InkAndBanner
        8
    InkAndBanner  
       2019-12-18 14:49:41 +08:00
    @littleylv 你上来就打楼主嘴巴子?
    dapengzhao
        9
    dapengzhao  
    OP
       2019-12-18 15:47:21 +08:00
    @InkAndBanner 菜鸟不懂就问,大佬受累了
    acthtml
        10
    acthtml  
       2019-12-18 15:57:35 +08:00
    做 OAuth2.0 就行
    fancy111
        11
    fancy111  
       2019-12-18 16:15:55 +08:00
    jwt token 的方法因为是不同域所以 token 没法加在 cookie 里面,因为不是前后端分离,所以没法在每次请求的时候加在 header 里面???
    这句话没一个地方说对了,你再把这两点理解清楚一下吧。
    dapengzhao
        12
    dapengzhao  
    OP
       2019-12-18 16:24:00 +08:00
    @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  
       2019-12-18 16:39:35 +08:00   ❤️ 1
    JWT 本身就是作为跨域来使用的,你先去学习一下 JWT 原理,你连原理都没懂就分析是在浪费时间。
    token 存入 cookie 是后端来交互的,你分别把 token 存在不同的域名 cookie 下就行了,后端获取到 cookie 再到单点登录服务器处理。。。 我字都不想打了,你还是去学习一下吧。
    还有后面的知识,我觉得你应该经验不足。
    dxl314
        14
    dxl314  
       2019-12-18 16:58:53 +08:00
    cookie 可以存指定域下啊
    hoythan
        15
    hoythan  
       2019-12-18 17:04:41 +08:00
    a 页面内嵌一个 iframe,
    从 a 访问到 b 域名,b 域名下做一个免登页面,地址栏带上 token,以及一些时间戳加密的验证之类的,然后 b 域名保存这个 token 到 cookie 即可实现无感知的免登。
    hoythan
        16
    hoythan  
       2019-12-18 17:06:39 +08:00
    同理,b 页面登录的时候也可以生成一个隐藏的 iframe,访问到 a 页面的免登页面,地址栏传递 token 过去。
    dapengzhao
        17
    dapengzhao  
    OP
       2019-12-18 17:09:49 +08:00
    @fancy111 谢谢回复
    看了很多
    4. JWT 的用法
    客户端接收服务器返回的 JWT,将其存储在 Cookie 或 localStorage 中。

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

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