当用户点击链接时,如何传输登录信息并自动登录到另一个网站


How to transfer login information and automatically log to another website, when user click on link?

我托管了2个网站,这两个网站使用相同的数据库来填充数据。 例如:用户 - 表具有用户登录详细信息,两个网站用户都可以通过此表访问其登录信息。

现在我想这样做:

在访问这两个网站之前,他们需要登录。

我的"网站A"有链接调用"阅读更多"当用户点击它时,该用户应重定向到"网站 B"。现在我想跳过B网站的"登录"过程(因为该用户已登录 A(。怎么做,

我想到了这个选项,但安全性较低:

  1. 一个网站 阅读更多链接

B_website/?用户名=abc&password=123&page=12

我想这不是一个好的选择,我可以通过什么方法来保持高安全性?

不不不 - 不要在URL中以纯文本形式传递用户名+密码!

我建议您查看您如何知道用户在站点 A 上登录。您的数据库中是否有某种标志将此用户标记为已登录?站点 B 能否以某种方式意识到此标志?由于您的两个站点共享一个数据库,因此这绝对是可能的。

请考虑以下方案:

  1. 用户登录到站点 A。
    • 生成一个唯一的"登录令牌",保存在您的数据库中,并发送到客户端。
  2. 用户到达站点 B。
    • 用户将他们之前收到的"登录令牌"发送到服务器。

如果用户发送的登录令牌与数据库中的记录匹配,则可以跳过身份验证阶段并将该用户标记为已登录到站点 B。

服务器会话基本上是手工设计的,可以解决这个问题。如果您的网站已经访问了同一个数据库,则可以利用PHP内置功能,该功能可以创建一个session_handler,用于打开数据库连接并将会话存储在数据库表中。

我个人是Symfony的HttpFoundation的忠实粉丝(见下文(。但是,您可以在本机执行此操作,而无需依赖任何外部库。

首先创建一个表(这是一个MySQL表,但适应它应该很容易:

CREATE TABLE sessions (
    sess_id VARBINARY(128) NOT NULL,
    data BLOB NOT NULL,
    sess_expires int(11) UNSIGNED NOT NULL
) COLLATE utf8_bin, Engine=InnoDB;
  

接下来,根据 PHP 文档创建一个会话处理程序session_set_save_handler()。创建可调用的函数,并按如下方式分配每个函数:

打开

创建数据库连接。

关闭

关闭数据库连接。

从数据库中检索会话。

将会话存储在数据库中。

摧毁

销毁会话。

干净

根据您的系统设置清理旧会话数据。

下面是一些不同的实现。它们都应该起作用,因此您认为最有吸引力的任何一个都可以用作基础。确定样式后,只需在每个客户站点中复制代码,它就会拉取共享会话!

Chris Shiflett 的教程可能是最基本和最容易访问的,如果你不熟悉这种事情是如何工作的。

DevShed有一个面向对象的方法,可以在很大程度上复制和粘贴。他们还很好地解释了如何在其他地方使用会话。

HttpFoundation - 使用锁定和其他机制,几乎是起手即用。如果您遵循面向对象编程并且熟悉或对 Composer 感兴趣,那么设置起来绝对是轻而易举的。

如果您通过 PHP 内置会话存储登录,并且两个网站使用相同的session_save_path,那么这很容易实现。只需将会话 ID 作为参数 SID 传递到 URL 中即可。然后,网站 B 应从网站 A 获取会话,并且随着用户群的共享,会话可以在其他网站上继续。

阅读更多链接应生成如下内容:

<a href="B_website/?page=12&SID=<?php echo session_id() ?>">Read more...</a>

如果您在 cookie 中手动存储某种会话 ID,则有不同的选择。登录时,您始终为两个网站的域设置 cookie。像这样,用户在两个网站上都自动登录,无论他在两个网站中的哪一个登录。

setcookie("SESSIONID", $session_id, time() + 86400, "/", $domain_A);
setcookie("SESSIONID", $session_id, time() + 86400, "/", $domain_B);

另一种方法是使网站 A 上的更多链接指向网站 A 上的特殊页面,然后设置要在网站 B 上登录的必要 cookie,然后重定向(通过 302 标头(到网站 B。该链接如下所示:

A_website/redirect_B.php?page=12

然后redirect_B.php会做这项工作:

setcookie("SESSIONID", $session_id, time() + 86400, "/", $domain_B);
header("Location: B_website/?page=12", true, 302);

会话传递到其他服务器的最佳方法取决于您实现登录的方式。有了有关如何管理登录会话的更多详细信息,就可以给出更准确的答案。

最安全的方法是通过 SAML 使用单点登录。

您应该使用基于令牌的安全性,即当用户在网站 A 中输入他的凭据时,网站 A 返回访问令牌,然后使用此令牌您可以在两个网站上验证用户,即在每个请求中发送访问令牌。

基本上就是社交网站登录的工作方式,它们还提供访问令牌,这称为身份验证协议。

当您单击"阅读更多"按钮时,您可以通过 AJAX 身份验证数据从网站"A"发送到网络"B":之后,您检查这些数据是否正确。如果是这样,请重定向到页面"B"(您可以通过ajax响应执行此操作(

   $.ajax({
        type: 'post',
        url: 'b.php',
        data: userauth,
        error: function(errors) {
            console.error(errors);
        },
        complete: function(data) {
            if(data=="correct"){ /*redirect*/ }else{ /*nothing*/ }
        }
    });

我认为这将是一种选择...

问候!

我会建议的最佳方式:

1:每次用户登录时都会生成一个 seeion ID现在用户下面的表结构

uname | password | seesion id     | user ip address  |isloogenid
a      pwd1      sessionidcreated  user looged in ip

是所有参数在用户中都是相同的登录,否则没有

$seesionifdromdb
$ipfromdb
$userloggedinfromdb
$currentipwheresiteisopened
$valeofphpsessionif
if(($seesionifdromdb == $valeofphpsessionif) && ($ipfromdb == $currentipwheresiteisopened) && ($userloggedinfromdb==1)){
    // here start session neede to make user logged in
}

根据您的情况,让我们有一个合乎逻辑的观点。网站:"网站A","网站B">

让有一般的登录流程 如果用户登录到"网站 A"或"网站 B",则将为该用户创建一个会话,其中包含一些会话 ID 和一些自定义会话变量,您将设置这些变量以保持用户在整个网站中登录

eg: $_SESSION['user_id'] = {some id from database};
    $_SESSION['prefered_language_code']='eng';
    $_SESSION['user_name'] = 'abc';

然后,您正在检查登录过程,直到这些变量在会话中可用

eg:function checkSession(){
            if($_SESSION['user_id']!=''){
                 return true;}
            else{return false;}
     }
    on the other pages of both website
  if(checkSession()){
     return true;
  }else{
  //send to login page of website A or Website B respectively;
  }

类似于此函数,您正在使用此函数来检查用户对其余网页的访问权限。当他注销时,您必须销毁该会话变量。

所以现在你的问题的答案是:1(由于您正在管理两个网站,并且根据您的评论,即"现在我想跳过B网站的"登录"过程(因为该用户已经登录了A(",这意味着在这两种情况下,用户的登录凭据应该是相同的。现在的解决方案是达到预期的情况,您应该使用相同的会话变量(仅用于检查用户登录状态的变量(遵循相同的登录过程,并在两个网站(即"网站 A 和网站 B"(中进行登录签到。

然后它们似乎是两个不同的网站,但从逻辑上讲,它们作为一个单一的网站工作,因为它们共享登录会话变量。这意味着如果用户登录到一个站点,那么从逻辑上讲,他是通过传递另一个网站的登录过程。

2(您可以在数据库中设置一些登录跟踪字段类型,以跟踪用户登录

 eg:loggin_token; comment some uniquely generated key or login_key

并使用一些会话变量设置这些

现在,您可以检查会话变量的会话,以在两个站点上保持登录检查

希望这会有所帮助,因为这是管理这些的最简单方法

忽略发送密码的任何建议。

Lix使用一次性令牌的答案是一种有效的方法。如果您不想打扰实现,您可能会对现有的单一登录实现感兴趣。

为此,您必须使用 SAML 或 Open ID 等技术。

https://github.com/onelogin/php-saml

https://github.com/openid/php-openid