【问题标题】:How can I create a PHP session from one remote server to another?如何创建从一台远程服务器到另一台的 PHP 会话?
【发布时间】:2016-10-17 10:12:18
【问题描述】:

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

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

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

简而言之,我希望一旦我收到我的第一个 JWT 请求并从 GameSite.comServiceSite.com 上进行会话,就是这样,会话就完成了。但它似乎只有在我从同一个域请求时才真正进行会话。我确实看到它正确地创建了一个会话,并填写了 $_SESSION,但是如果请求来自非ServiceSite.com URL,则该数据根本不会持久。

【问题讨论】:

  • 您可以使用集中式会话存储,例如 Redis

标签: php session single-sign-on jwt


【解决方案1】:

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

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

  1. 对用户进行身份验证,发出 JWT 代码并在共享存储(最有可能是数据库)中创建 key=>value 类型的记录。 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,但传递快速过期的密钥应该更安全。为每个域添加一张图片。

您可以在每个域上创建会话,而不是 cookie。原理一样。

【讨论】:

  • 看来这可能不是我真正想要的。我总是可以传递 JWT 令牌,但我不想要复杂性。困扰我的是我正在从 GameSite.com ping,我在 ServiceSite.com 上创建的会话上执行print_r(),但它并不仅仅因为请求来自 GameSite.com 而持续存在。这让我想知道我是否可以有第二个请求来实现我想要的:向 SS.com 发出请求,然后在 SS.com 向自己发送一个与从 GameSite.com 获得的请求基本相同的请求,只是源自 SS.com 的域。我得尽快试试。
【解决方案2】:

尝试将所需的数据和会话保存在数据库本身中。它似乎是少量的数据和日志。

游戏结束后,将会话保存在数据库中,然后从您所在的任何地方打开。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2017-03-29
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多