php - 如何创建从一台远程服务器到另一台远程服务器的 PHP session ?

标签 php session single-sign-on jwt

我有 ServiceSite.com (SS) 和多个 GameSite.com。所有游戏都通过SS认证,然后用自己的个人数据库登录。这一切都通过一个简单的 JSON API 完成,无需登录 SS 即可进入游戏。

我的一个目标是登录游戏并通过游戏访问 SS 的功能,例如访问玩家的联系人列表和个人资料,这两者在所有游戏之间共享。在 GameSite.com/play 中,他们将点击 ServiceSite.com/contacts 的链接并获得响应,就像从 ServiceSite 打开该链接一样。 com。我使用 JSON Web token 手动将用户登录到 SS,以模拟真实登录 ServiceSite.com

只要它们位于同一域中,这就有效。这意味着,当我开发游戏时,我将使用 ServiceSite.com/tempgameurl 和对 ServiceSite.com 的任何调用都可以建立和保持 session 。但是,一旦游戏获得自己的域,或者如果我在本地主机上工作,我就无法让它识别后续请求的 session 。如果我想要响应,我总是必须传递 JWT token ,这不适合我正在做的事情。目标是加载游戏,“戳”SS 创建登录,然后如果玩家访问 ServiceSite.com,他们将拥有 session ,就好像他们登录了 ServiceSite.com 的首页并手动登录。

简而言之,我希望一旦我发出第一个 JWT 请求并从 GameSite.comServiceSite.com 上进行 session ,就这样, session 就是制成。但如果我从同一个域发出请求,它似乎只会真正进行 session 。我确实看到它正确创建了一个 session ,填充了 $_SESSION,但如果请求源自非 ServiceSite.com URL,则该数据根本不会保留。

最佳答案

session 和 Cookie 与域相关,这是一个浏览器安全问题。你不能欺骗这一点。但是,您可以尝试一个“技巧”,尽管它有点复杂:

您需要为每个域设置一个 cookie:

  1. 对用户进行身份验证,发出 JWT 代码并在共享存储(最有可能是数据库)中创建 key=>value 类型的记录。键应该是唯一的,值应该是 JWT 代码,并设置 20-30 秒的过期时间。

  2. 在响应 HTML 中,您需要让浏览器为其他域设置 cookie。这只能在这些域上完成。所以你需要用类似的东西来愚弄它:

    <img src="http://anotherDomain/setCookie.php?key=keyFromSharedStorage" style="display:none;" />

  3. 在setCookie.php中,检查共享存储并根据$_GET['key']检索JWT。然后使用该 JWT 设置 cookie。

您可以直接传递 JWT,但传递快速过期的 key 应该更安全。为每个域添加图像。

您可以在每个域上创建一个 session ,而不是 cookie。确实是同样的原理。

关于php - 如何创建从一台远程服务器到另一台远程服务器的 PHP session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37849947/

相关文章:

php - 匹配电子邮件的正则表达式

php - 如何使用 Laravel 从命名空间中查找特定字符串

session - 如何在 Magento 之外创建 Magento session ?

r - 创建一个函数来替换计算 session 的列中的 NA

javascript - Codeigniter jquery/ajax 外部文件 403

php - Paypal类文件错误

c# - 如何在 asp.net 中的 Handler 中设置 session 值

tomcat - Nginx 作为使用 Kerberos 的应用程序的负载平衡器

ruby-on-rails - ruby-saml SAMLRequest 作为 POST 而不是 GET

single-sign-on - 这个 SAML SSO 实现是否正确?