我有 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.com
在 ServiceSite.com
上进行 session ,就这样, session 就是制成。但如果我从同一个域发出请求,它似乎只会真正进行 session 。我确实看到它正确创建了一个 session ,填充了 $_SESSION,但如果请求源自非 ServiceSite.com
URL,则该数据根本不会保留。
最佳答案
session 和 Cookie 与域相关,这是一个浏览器安全问题。你不能欺骗这一点。但是,您可以尝试一个“技巧”,尽管它有点复杂:
您需要为每个域设置一个 cookie:
对用户进行身份验证,发出 JWT 代码并在共享存储(最有可能是数据库)中创建 key=>value 类型的记录。键应该是唯一的,值应该是 JWT 代码,并设置 20-30 秒的过期时间。
在响应 HTML 中,您需要让浏览器为其他域设置 cookie。这只能在这些域上完成。所以你需要用类似的东西来愚弄它:
<img src="http://anotherDomain/setCookie.php?key=keyFromSharedStorage" style="display:none;" />
在setCookie.php中,检查共享存储并根据$_GET['key']检索JWT。然后使用该 JWT 设置 cookie。
您可以直接传递 JWT,但传递快速过期的 key 应该更安全。为每个域添加图像。
您可以在每个域上创建一个 session ,而不是 cookie。确实是同样的原理。
关于php - 如何创建从一台远程服务器到另一台远程服务器的 PHP session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37849947/