如何跨服务器验证用户会话?

时间:2009-06-23 11:28:50

标签: php authentication token

问题:应在用户的主页上显示下载链接。 只有用户登录才能访问该下载链接。

但真正的问题是用户的主页和下载链接位于不同的Web服务器上。

有没有办法可以使用下载链接发送令牌并在那里进行验证?

3 个答案:

答案 0 :(得分:1)

users server = serverA.com
your server  = serverB.org

如果我理解正确,问题是,用户只登录服务器A,但不登录服务器B,并且无法共享会话状态(例如,通过数据库进行会话处理)?

从我的头脑中,我可以想到一个选择:

服务器B只询问服务器A
表示:serverA上的链接包含用户会话ID *。然后,serverB会询问服务器A会话是否有效。

如果没有这两台服务器之间的通信,你就无法做到。

*注意:使用随机令牌会更好,而不是session-id。会话ID不应该是私有的。

不会阻止用户分享网址,因此如果他们希望其他人下载该文件,他们只需传递网址即可。另一方面,恶意用户也可以使用他的session-id进行此操作。

答案 1 :(得分:1)

您可以使下载链接将包含用户信息的表单提交给目标服务器。这样做有安全隐患,因为登录信息会作为隐藏表单字段的值出现在页面源中,所以可能不是您想要的方式。

第二种选择是将会话信息存储在数据库中,然后简单地将会话密钥传递给新服务器。这将要求第二台服务器能够联系第一台服务器的数据库并对其运行查询。设置具有从该服务器登录以进行读取访问的权限的用户名应该足以在不打开许多安全漏洞的情况下执行此操作。

最后,您可以在第一台服务器上设置一个Web服务,该服务在给定用户名时返回是/否答案,验证用户的登录状态。然后,第二台服务器上的接收链接将获取用户名并在构建响应之前验证登录状态。

答案 2 :(得分:0)

如果用户点击该链接,他将从他的服务器转到您的服务器。

如果他已登录您的服务器,那么您可以执行任何检查,因为他试图访问您服务器上的文件。即使链接显示在其他服务器上。

也就是说,如果您使用会话来保持用户登录,则下载代码中应该足以启动与session_start()的会话,并且用户应该已登录他已经存在的会话。