zoukankan      html  css  js  c++  java
  • 项目多方协同开发,单点登录问题

    最近开发了一个项目,这个项目由 A, B, C 三方共同开发。我们是 B 方,登录相关都是由 A 进行开发,然后跳转到 B 和 C 的系统,将用户 token 通过 url 传递过来,我们通过 url获取 token 就能知道当前登录用户了。

    但是我方和 C 方实现 token 获取时使用了不同的方法,也就发现了一些问题。

    我方使用的是一个中转页面进行写token,获取用户信息等操作,保存到 localStorage 中,然后重定向到实际的页面,如:xxx.xxx.xxx/redirect?token=xxx&url=xxx。这样当用户在 A 系统登录后,页面上的按钮跳转到我方系统都会先跳转到这个中转页面进行我方系统的登录再重定向到实际访问的页面。

    但是后面发现一个问题:用户分享了一个我方系统的链接出去,别人打开此链接后如果没有在我方系统进行登录那就没权访问,即使是在 A 放系统进行登录了。

    一开始想到的解决方案是,当发现没有权限便跳转到登录页,并带上参数 url,值为我方系统的中转页和当前页的地址:xxx.xxx.xxx/redirect?url=当前页。用户登录成功就跳转到这个 url 并加上 token 参数,因为是中转页的地址所以会先在我方系统进行登录,然后跳到实际页面,也就是分享的那个链接。

    而 C 方却没有使用这种统一登录跳转页的方法,而是每个页面 url 接收 token 参数。这样看似简单,但是用户分享页面的时候就会把 url 直接分享出去,当别人拿到这个 url 打开的时候确实不会发生没登录的情况,因为 token 就带在 url 上,但是别人就直接获取到了分享者的用户了,这肯定是不合理的。所以不能使用这种每个页面接收 token 的方式。

    后来我又想了下,我们自己的那种方法还是有点麻烦,要拼 url 链接,登录页登录后还得加上 token 跳转。就又想到了一种方法,登录成功后就加载一个隐藏的 iframe,链接就是我们的那个统一登录页链接,把 token 传过来我们这边也就一起登录了,而且之后跳转我方系统也不用再通过这个页面来进行中转了。

    当然,如果存在网络问题,在 iframe 没有加载完成的时候用户就点击页面按钮跳转到第三方页面,也会出现未登录的情况。

    iframe 的方式是比较简单的实现单点登录的一种方式。如果要实现完整的单点登录还是需要更复杂的流程:

    1、A系统进行登录,登录完成A系统 localStorage 保存token

    2、用户访问第三方系统,发现没有登录,跳转到A系统登录页,并将当前页的链接在 url 中通过参数 callbackurl 传过去

    3、A系统登录页发现参数中有 callbackurl 参数,并且 localStorage 存在 token,说明用户已登录,则跳转到 callbackurl 中第三方的页面,并在跳转之前拼接上 token 参数

    4、第三方系统发起 ajax 请求的时候,发现 url 中有 token 参数,说明需要进行登录操作,拦截这次请求而调用登录接口传上 token

    5、第三方系统登录成功后,重写 url 删除 token 参数,开始正常使用系统

  • 相关阅读:
    网络流 KM dinic
    网络流 增广路 回退
    树链剖分
    线段树区间更新 lazy
    全排列
    各种蕴含算法思想的DP
    各种蕴含算法思想的DP
    Strassen矩阵乘法之思考
    [0,x)的随机数
    hdu1331 按着题目的公式直接写
  • 原文地址:https://www.cnblogs.com/3body/p/13266993.html
Copyright © 2011-2022 走看看