在两个站点之间安全地传递用户


Securely passing users between two sites

我有我的网站'A'。我将有一个商业合同与网站'B',使网站'B'的用户(将有许多这样的网站),以重定向他们的用户到我的网站,当用户做许多' a '对'B'相关的动作之一。我可以直接或通过'B'用户的浏览器将任何信息从'B'传递到'A',但我(即网站A)需要验证它们确实来自'B'并自动将它们登录到网站'A'。

知道 OAuth在这方面做得很好——但只在"用户"级别。这里发生的事情是站点a和站点B之间的商业合同-并且不需要给'B'的每个用户带来不便来完成整个OAuth的跳跃…

还请注意,网站'B'用户将呈现一个表单,他们需要点击这些动作被传输到我的网站' a '。任何秘密/认证数据(如果有的话)都可以被"B"用户看到(和篡改)。我的网站'A'必须防止这种情况。

这是关闭:安全地在网站之间传输用户。

选项列表:

  1. 在两端通过HTTPS编写一个web服务调用来检索用户详细信息,这只适用于特定的登录对。
  2. 看一下"直通认证",这是一个允许用户身份从一个系统传递到另一个系统的概念。
  3. 我现在能想到的最好的事情就是传递一个用户ID的哈希值,或者如果你担心的话,传递一些其他用户数据的哈希值。
  4. 站点B可以有一个允许站点a为用户创建会话的web服务。

但我想知道,自从一年半前问过这个问题以来,人们是否有不同的看法。

我的问题:

  1. 我应该如何实现这一点?
  2. 有现成的php实现吗?

[我已经实现了类似的东西,结果发现这是一个有缺陷的机制,所以我很好奇正确的机制是什么。]

这些网站(即银行和博客)的安全级别是什么?对于非常简单的情况,站点B可以缓存表单数据CHECKSUM。当用户被重定向到A时,A可以直接向B查询校验和并验证数据。可以在站点之间设置IP或基于密钥的身份验证,以增加安全性。

如果你需要更多的安全性,也许OAuth仍然是最好的选择。请记住,用户已经登录到B,因此他们不需要输入任何东西。他们提交的表单实际上可以同时设置OAuth,这样当用户被重定向到A时,A实际上获得令牌,然后可以通过OAuth从B检索数据(从而验证数据来自B)。

除了已经提到的Shibboleth之外,还有一个兼容的SAML 2.0标准,您可能会感兴趣,还有一个非常好的PHP实现了这两个协议SimpleSAMLphp,它是现成的web服务以及用于自定义应用程序的库。设置这样一个SSO联合的学习曲线并不太陡峭,SimpleSAMLphp有很好的文档。

但是,由于SSO需要所有b/s的SAML/shibbolth,并在各方之间设置和维护联邦元数据,因此OAuth可能仍然是您更好的选择。

您可以使用像Shibboleth这样的单点登录系统。

Shibboleth System是一个基于标准的开源软件包,用于跨组织边界或组织内部的web单点登录。它允许网站以保护隐私的方式为个人访问受保护的在线资源做出明智的授权决定。

如果这对你来说太过分了,只需通过HTTPS API通过每个用户唯一的随机散列授予两个站点访问彼此站点的用户数据,该散列只是在单击"按钮"时传递。