如何同时从两个网站登出- PHP会话处理


How to logout from two website at the same time- PHP Session handling

假设我们有两个网站example.com &不同域中的Example.net。这两个站点的用户数据是相同的,所以我们可以用相同的用户名和密码登录这两个站点。

当用户单击example.com上的注销按钮时,我们也必须从example.net注销他们。两个网站都是在同一个浏览器(不同的选项卡)上打开和登录的。

当用户从example.com注销时,是否有可能破坏example.net的会话cookie ?

由于这两个站点之间不共享任何登录信息,因此它们都保持独立的会话数据,并且您不能修改其他一些网站的会话数据。

一个解决方案是编写一个API与另一个网站通信,销毁会话数据。

的例子:

Tab 1: Opened "示例。com"并以"alice"登录

Tab 2: Opened "示例。net"并以"alice"登录

, 现在,"相互注销",做以下。,

当你在标签1 (.com域名)点击"注销"时,它应该转到:

  • http://example.net/api/remote_logout.php?userid=alice
  • 和重定向到:
  • http://example.com/logout.php
同样,当你在标签2 (.net域)中点击"注销"时,它应该转到:
  • http://example.com/api/remote_logout.php?userid=alice
  • 和重定向到
  • http://example.net/logout.php

您需要有一个中间站点或web服务来跟踪用户会话,即abc.com和xyz.com站点共同使用
在这两个站点上,您都可以每隔一定的时间发送一个ajax请求,以检查中间服务的用户会话的有效性。如果用户在任何一个站点登出,会话将被破坏。所以当来自其他站点的ajax请求检查时,它会关闭会话,因此您可以编写代码来销毁cookie或任何您想要它做的事情。

下面是我在Drupal中的做法。如果您使用任何CMS,那么将有一个特定的方式来做到这一点,但核心结构是相同的,以便在PHP环境中支持它。当一个站点收到内部登录请求时,使用给定的用户名和密码登录到另一个站点。

  • 首先登录到网站,并获得cookie令牌等,以进行与用户需求相关的其他内容。
这里是Drupal CMS的示例代码。您可以了解它的工作原理和功能,然后复制相关部分以在您的环境中工作。
// Build request data
$user_login_method = 'POST';
$user_login_retry = 0;
$post_data = array('username' => trim($username), 'password' => trim($password));
$user_login_data = http_build_query($post_data, null, '&');
// Send a request with the data to other site
$login_request = drupal_http_request($other_site_login_url, $user_login_headers, $user_login_method, $user_login_data, $user_login_retry);
// Look for set cookie header value in the response
if(isset($login_request->headers['Set-Cookie'])) {
// Set the cookie name and do the rest based on values
}
  • 第二种是调用其他站点的注销url来注销用户。请记住,您必须使用登录调用时返回的cookie值,但如果您从注销页面向其他站点进行ajax调用,则没有办法解决。

如果您查看Drupal站点API以获取有关drupal_http_request方法的更多信息

我会尝试使用会话处理在数据库中存储数据。