Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于第三方访问资源的一次性登录令牌_Php_Security_Encryption_Access Token - Fatal编程技术网

Php 用于第三方访问资源的一次性登录令牌

Php 用于第三方访问资源的一次性登录令牌,php,security,encryption,access-token,Php,Security,Encryption,Access Token,我们有一个网站(foo.com)进行在线培训。用户登录,然后完成培训 我们已经同意允许另一家公司(bar.com)通过我们的培训向他们的客户提供服务。其中一个要求是,他们的用户不需要在我们的网站上创建单独的登录帐户 以下是我最初的攻击计划: 当用户登录bar.com(另一家公司的网站)时,其后端将向foo.com(我们的网站)发出安全的HTTPS请求,请求专门针对该用户的一次性访问令牌。例如,他们可能会请求以下URL: 这要求访问bob的帐户。“pass”组件是foo.com和bar.com已

我们有一个网站(foo.com)进行在线培训。用户登录,然后完成培训

我们已经同意允许另一家公司(bar.com)通过我们的培训向他们的客户提供服务。其中一个要求是,他们的用户不需要在我们的网站上创建单独的登录帐户

以下是我最初的攻击计划:

  • 当用户登录bar.com(另一家公司的网站)时,其后端将向foo.com(我们的网站)发出安全的HTTPS请求,请求专门针对该用户的一次性访问令牌。例如,他们可能会请求以下URL:

    这要求访问bob的帐户。“pass”组件是foo.com和bar.com已知的共享密钥,用于验证请求是否合法

  • foo.com将使用一次性访问令牌(例如,0123456789ABCDEFG)进行响应,该令牌与用户id(bob)一起存储到数据库中

  • bar.com将向用户展示一个超链接,链接回foo.com上的在线培训。大概是这样的:

  • 当用户单击链接时,foo.com会检查数据库中的令牌,并(如果尚未过期)将其从有效令牌表中删除,并创建一个会话变量,指示bob现在已登录,然后将其重定向到培训

  • 我想知道的是,安全漏洞在哪里,我如何缓解它们?我知道URL将被加密,我知道一个条目将显示在我的服务器日志中,但这是一个一次性令牌,所以我不担心这一点。我可以想象有人强制使用不同的令牌,因此我将用户名包含在用户单击的第二个登录url中,这样令牌将只与该特定帐户一起工作

    但我真正担心的是我不知道的事情。我不太了解这里的安全问题

    (请注意,这只包括正在尝试登录的现有用户。我将使用另一种方法在foo.com上实际创建用户帐户)


    我正在用PHP编写代码。

    您正在寻找的是单点登录(SSO)。有许多不同的行业标准协议可以实现这一点,但您基本上要做的是让另一个实体对用户进行身份验证,并以一种您可以验证您信任的东西(他们的身份验证系统,不管它是什么)是否发布了该信息的方式向您提供该信息

    最标准的方法是SAML(安全断言标记语言)。这是一个第三方将向其系统进行身份验证的协议,它将生成一个SAML断言,基本上说用户是谁(以及其他信息,如果需要的话)。断言是数字签名的,因此您可以验证是谁发布的。这要求您和第三方交换密钥(以证书的形式),并了解断言将包含什么内容等(通常以身份提供者和服务提供者之间交换的SAML元数据表示)


    许多平台都有许多SAML实现/引用,包括PHP。如果你想做到正确、安全,这就是你应该调查和追求的。

    我只是想知道SAML在这方面是否有点过火。。。在这种情况下,有没有精简的裸骨SAML?OpenID可能是一个可行的替代方案。这是一个更简单的协议,但是有更少的库和参考实现。