从一个网站向另一个网站发送身份验证令牌的最佳做法?

时间:2017-06-16 06:54:17

标签: javascript

我有一个网站,用户将登录他/她的帐户,然后他们会被重定向到另一个网站,他们应该自动登录。两个网站都可以访问同一个数据库。用户将使用令牌进行身份验证,但如何将其传递给其他网站。

1 个答案:

答案 0 :(得分:0)

根据服务器技术的不同,有多种选择。

您没有告诉您的服务器是什么平台(windows,linux)以及您使用的Web服务器(Apache,IIS),您使用的Web技术(ASP.NET,PHP,Ruby,node.js)或你使用的框架(laravel,symfony,wordpress,ruby on rails)。所以很难准确。

反正。

例如,在IIS上,您可以选择以这些方式存储会话状态:

  • InProc 模式,用于将会话状态存储在Web服务器的内存中。这是默认设置。
  • SQLServer 模式将会话状态存储在SQL Server数据库中。这可确保在重新启动Web应用程序时保留会话状态,并使会话状态可用于Web场中的多个Web服务器。
  • 更多...

对于在Linux上运行的Apache / PHP,您可以跨机器对会话文件夹进行rsync,或者将会话状态存储在数据库中。

作为最后的手段,您可以拥有一个连接Web服务器的受保护的websocket,并允许它们查询其他有关会话令牌的内容。

  

应该清楚的是,客户端可用的会话ID(cookie,本地存储或其他)不是Web服务器使用的会话状态。这是两件不同的事情。

您想要的是 SSO (单点登录)。

要明确:您必须直接在服务器之间移动信息,而无需客户端的帮助。出于安全原因,这一点很重要,不应与客户端可用的会话ID混淆。

此外,存在跨域问题。这仅适用于两个服务器的域(URL)不同的情况。出于安全原因,您无法将一个域的cookie发送给另一个域。或者从另一个已加载的页面访问另一个域的本地存储。换句话说,当您在一个域下的cookie或本地存储中设置会话ID时,它将无法在另一个域上访问。

  

但是围绕域边界有一种方法,如下所示。

在您的情况下,数据库可能是最佳选择。你可以这样做。

  • 在任何一方登录时,您将会话ID和时间戳存储在SQL表中,该表指向用户的登录数据(一个用于第一个服务器,另一个用于第二个服务器 - 以防您使用异构Web技术,例如as ASP.NET and PHP);
  • 当您将客户端从一个域(服务器)重定向到另一个域时,您必须确保传递会话ID(没有cookie或本地存储) - 您可以通过放置会话ID轻松实现到URL的查询字符串中,例如:

    www.otherdomain.com/landing_page.html?sid=75UFNE784324jEJIRO4234782394JKR

  • 在另一台服务器的登录页面上,您现在可以获取该会话ID,根据SQL表查询它并检索该服务器的登录信息。

我希望这会对你有所帮助,这可能有点令人困惑,因为它是没有具体代码的通用解释。但是要注意一点,你应该能够做到!