session - 您最喜欢的跨域 cookie 共享方法是什么?

标签 session cookies cross-domain sharing

我发现 iframe/p3p 技巧是最流行的,但我个人不喜欢它,因为 javascript + 隐藏字段 + 框架真的让它看起来像一个黑客工作。我还遇到过使用 Web 服务进行通信的主从方法 ( http://www.15seconds.com/issue/971108.htm ),它似乎更好,因为它对用户是透明的,并且对不同的浏览器具有鲁棒性。

是否有更好的方法,每种方法的优缺点是什么?

最佳答案

我的方法将一个域指定为“中心”域,将任何其他域指定为“卫星”域。

当有人点击“登录”链接(或提供持久登录 cookie)时,登录表单最终会将其数据发送到中央域上的 URL,同时还会显示一个隐藏的表单元素,说明它来自哪个域来自(只是为了方便,因此用户随后会被重定向回来)。

然后,位于中央域的该页面继续设置 session cookie(如果登录顺利)并重定向回用户登录的任何域,并在 URL 中使用专门生成的 token ,该 token 对于该 session 是唯一的。

然后,卫星 URL 处的页面检查该 token 以查看它是否确实对应于为 session 生成的 token ,如果是,则它会在没有 token 的情况下重定向到自身,并设置本地 cookie。现在该卫星域也有一个 session cookie。此重定向会清除 URL 中的 token ,因此用户或任何爬网程序都不太可能记录包含该 token 的 URL(尽管如果记录了,也没关系,该 token 可以是一次性 token )。

现在,用户在中央域和卫星域都有一个 session cookie。但如果他们访问另一颗卫星怎么办?嗯,通常情况下,它们在卫星看来是未经身份验证的。

但是,在我的整个应用程序中,每当用户处于有效 session 中时,指向其他卫星域上页面的所有链接都会附加一个 ?s 或 &s。我保留这个查询字符串的意思是“与中央服务器检查,因为我们认为该用户有一个 session ”。也就是说,任何 HTML 页面上都不会显示 token 或 session ID,仅显示无法识别某人的字母“s”。

如果还没有有效的 session ,接收此类 's' 查询标记的 URL 将重定向到中央域,并显示“你能告诉我这是谁吗?”通过在查询字符串中放入一些内容。

当用户到达中央服务器时,如果他们在那里经过身份验证,中央服务器将简单地接收他们的 session cookie。然后,它将使用另一个一次性 token 将用户发送回卫星,卫星将像登录后的卫星一样对待该 token (见上文)。即,卫星现在将在该域上设置一个 session cookie,并重定向到自身以从查询字符串中删除 token 。

我的解决方案无需脚本或 iframe 支持即可工作。它确实需要将“?s”添加到任何跨域 URL,其中用户可能在该 URL 上还没有 cookie。我确实想到了一种解决这个问题的方法:当用户第一次登录时,在每个域周围设置一系列重定向,并在每个域上设置一个 session cookie。我没有实现这一点的唯一原因是,它会很复杂,因为您需要能够设定这些重定向发生的顺序以及何时停止,并且会阻止您扩展超过 15 个域左右(太多,您就会危险地接近许多浏览器和代理的“重定向限制”)。

后续说明:这是 11 年前写的,当时网络非常不同 - 例如,XMLhttprequest 不被视为可以依赖的东西,更不用说跨域了。

关于session - 您最喜欢的跨域 cookie 共享方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/263010/

相关文章:

javascript - 来自不支持 JSON-P 输出的外部域的 jQuery "getJSON"

php - session 变量未设置,但仅在 Internet Explorer 中设置,并非在所有计算机上设置

php - AJAX 调用在没有明显原因的情况下破坏 session

javascript - 检查是否启用了第三方 cookie

javascript - 如何在地址栏中设置cookie?

cookies - 经典 ASP : How to check if ASPSESSIONID* cookie has been marked as secure?

Jquery ajax 加载停止从 https 站点工作

jquery - 没有预检的跨域 http post

node.js - 快速 Passport session 不工作

php - 在一页或所有页面上写 session 开始?