【问题标题】:How to logout from two website at the same time- PHP Session handling如何同时从两个网站注销 - PHP 会话处理
【发布时间】:2012-01-13 20:04:59
【问题描述】:

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

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

当用户从example.com注销时,是否可以销毁example.net的会话cookie?

【问题讨论】:

  • 当您说两个站点中的用户数据相同时,这是否意味着两个站点共享一个数据库,因此您可以在数据库中放置一个标志?
  • 嘿phpmeh,这是一个很好的建议。但是这两个应用程序不共享同一个数据库。此外,我们无法访问第二个站点的数据库或代码库。有没有别的办法?谢谢。
  • 你如何同时在两个网站上创建会话?通过 API?
  • 如果 2 个站点不共享任何内容,他们如何使用相同的凭据登录?在一个站点上注册的用户如何最终获得与另一个站点相同的凭据?
  • 如果您正在调用可以在其他站点创建用户的“Web 方法”,那么也许您还可以创建一个 Web 方法,该方法可以在对方注销时注销用户。每次用户注销时调用它。

标签: php session


【解决方案1】:

由于两个站点之间不共享任何登录信息,因此两个站点都保存着独立的会话数据,您无法修改其他网站的会话数据。

一种解决方案是编写一个与其他网站通信的 API,以销毁会话数据。

例子:

选项卡 1:打开“Example.com”并以“alice”身份登录

选项卡 2:打开“Example.net”并以“alice”身份登录

---现在,要“相互注销”,请执行以下操作。---

当您在标签 1(.com 域)中单击“注销”时,它应该转到:

类似地,当您在选项卡 2(.net 域)中单击“注销”时,它应该转到:

我认为这对你来说很清楚。

【讨论】:

  • 对于选择使用 Facebook 帐户登录我们网站的用户退出 Facebook,我们必须做同样的事情。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    以下是我在 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 方法的更多信息。

    希望这将帮助您在您的环境中使用 PHP 进行编程技能。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 哪个数据库?他说这两个是不同的。像这样的会话处理如何工作?你能解释一下吗?你能扩展这个答案吗?
      • 您可以设置一个仅用于会话处理的数据库,并更改 PHP 的默认会话处理程序以使用该数据库。如果您对两个域都执行此操作,则应该可以存储一些个人信息,然后用于仅具有 1 个会话(ID)或至少在注销时同时杀死两者。
      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2017-04-13
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多