2015-11-28 194 views
2

我试图将HybridAuth应用到使用传统电子邮件+密码注册和登录的现有Web应用程序中,但我仍不明白如何使用HybridAuth对用户进行身份验证。HybridAuth身份验证Cookie

我现有的认证系统

在我现有的登录系统,谁愿意登录送他的电子邮件地址和密码到服务器的注册用户。如果电子邮件和密码是正确的(我不以明文存储用户的密码,但密码验证过程与此问题无关),则服务器创建用户的加密密码和随机密钥的散列。该散列存储在Cookie中,并且还用于创建包含之前创建的散列,用户的电子邮件和IP地址全部散列在一起的认证码。验证码存储在用户的会话中。

当谁的登录尝试访问该网站的用户,服务器从他的饼干采用哈希,用他的电子邮件和IP地址散列它,并将它与这是存储在会议验证码早。如果代码匹配,用户将被认证,否则,用户将被重定向到登录页面。

新HybridAuth系统

到目前为止,我只是通过Facebook实现登录。当新用户点击“通过Facebook登录”按钮时,服务器将执行多个脚本,将用户重定向到Facebook,以便他可以授权我的应用程序,并在用户的Facebook个人资料中创建一个新的用户记录。此时,用户已注册并登录。

当此用户尝试与我的应用进行交互时,我必须以某种方式验证其身份。我用这个代码:

if ($_SESSION['facebook_connected'] == true) { 
     try { 
      // try social login 
      $config = PUBLIC_ROOT . 'handlers/hybridauth/config.php'; 
      require_once(PUBLIC_ROOT . 'handlers/hybridauth/Hybrid/Auth.php'); 
      $hybridauth = new Hybrid_Auth($config); 
      $adapter = $hybridauth->authenticate('Facebook'); 
      /* check if the user is registered 
      * 
      * ... 
      * 
      */ 
      return true; 
     } catch (Exception $e) { 
      return false; 
     } 
    } 

当这段代码返回true时,用户被认证。

每次我使用社交身份验证向我的应用程序发送请求时,Web浏览器必须等待约1-2秒才能收到请求的网页/数据。当我使用电子邮件+密码认证时,网页几乎是即时服务器。

这让我觉得HybridAuth每次要验证用户时都要与Facebook服务器进行通信,这非常缓慢。

我的问题是:HybridAuth可以为通过Facebook登录的用户创建某种身份验证Cookie,并在每次发送请求时安全地对其进行身份验证,而无需与Facebook通信?

对不起,我想解释我的整个身份验证系统,因为它可能是错误的/不安全的/过时的,我必须做一些修改才能有效地使用HybridAuth。

备注:HybridAuth文档非常糟糕。

回答

1

此列添加到您的MySQL用户表

CREATE TABLE `users` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `password` VARCHAR(250) NOT NULL, 
    `name` VARCHAR(60) NOT NULL, 
    `email` VARCHAR(250) NULL DEFAULT NULL, 
    `mobile` VARCHAR(50) NULL DEFAULT NULL, 
    `active` TINYINT(4) NOT NULL DEFAULT '0', 
    `gender` VARCHAR(50) NOT NULL DEFAULT '0', 
    `img` TEXT NULL, 
    `date_joined` DATE NOT NULL, 
    `facebook` INT(11) NOT NULL DEFAULT '0', 
    `fidentifier` VARCHAR(500) NULL DEFAULT NULL, 
    `fprofileURL` VARCHAR(500) NULL DEFAULT NULL, 
    `fphotoURL` VARCHAR(500) NULL DEFAULT NULL, 
    `fdisplayName` VARCHAR(500) NULL DEFAULT NULL, 
    `ffirstName` VARCHAR(500) NULL DEFAULT NULL, 
    `flastName` VARCHAR(500) NULL DEFAULT NULL, 
    `fgender` VARCHAR(50) NULL DEFAULT NULL, 
    `flanguage` VARCHAR(50) NULL DEFAULT NULL, 
    `femailVerified` VARCHAR(500) NULL DEFAULT NULL, 
    `fcoverInfoURL` VARCHAR(800) NULL DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB 
; 

然后创建PHP文件facebook.php

 <?php 
    include 'sql.php'; 
      function generateRandomString($length = 10) { 
     $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'; 
     $charactersLength = strlen($characters); 
     $randomString = ''; 
     for ($i = 0; $i < $length; $i++) { 
      $randomString .= $characters[rand(0, $charactersLength - 1)]; 
     } 
     return $randomString; 
    } 
     $config = array(
      "base_url" => "https://yourdomain.com/handlers/hybridauth/", 
      "providers" => array (
      "Facebook" => array (
       "enabled" => true, 
       "keys" => array ("id" => "YOUR_ID", "secret" => "YOUR_SECRET"), 
       "scope" => "email,public_profile", 
       "display" => "page" 
     ))); 

     require_once("handlers/hybridauth/Hybrid/Auth.php"); 

     try{ 
     $hybridauth = new Hybrid_Auth($config); 

     $adapter = $hybridauth->authenticate("Facebook"); 

      $user_profile = $adapter->getUserProfile(); 
     } 
     catch(Exception $e){ 
     $user_profile = "denied" ; 

     } 

     if ($user_profile == "denied"){ 
         ?> 
      <script> 
     window.parent.location.href=("login.php?error=1"); 
     </script> 
     <?php 

     } 
     else 
     { 
      $fidentifier= $user_profile->identifier; 
      $fprofileURL= $user_profile->profileURL; 
      $fphotoURL= $user_profile->photoURL; 
      $fdisplayName= $user_profile->displayName; 
      $ffirstName= $user_profile->firstName; 
      $flastName= $user_profile->lastName; 
      $fgender= $user_profile->gender; 
      $flanguage= $user_profile->language; 
      $femailVerified= $user_profile->emailVerified; 
      $fcoverInfoURL= $user_profile->coverInfoURL; 
      $femail= $user_profile->email; 
      $fphone= $user_profile->phone; 



      $sqlc = "SELECT * FROM users WHERE fidentifier='$fidentifier' AND facebook=1"; 
     $rs_result = $conn->query($sqlc); 

     if ($rs_result->num_rows == 1){ 
     $row = $rs_result->fetch_assoc(); 
     $_SESSION["user_id"] = $row["id"]; 

        ?> 
      <script> 
     window.parent.location.href=("profile.php"); 
     </script> 
     <?php 
     } 
     else 
     { 
      $sqlc1 = "SELECT * FROM users WHERE (email='$femailVerified' OR email='$femail') AND facebook=0"; 
     $rs_result1 = $conn->query($sqlc1); 

     if ($rs_result1->num_rows ==1){ 
     $row1 = $rs_result1->fetch_assoc(); 
    $ssid=$row1["id"]; 
    $sql4 = "UPDATE users SET 
    fidentifier='$fidentifier', 
    fprofileURL='$fprofileURL', 
    fdisplayName='$fdisplayName', 
    name='$fdisplayName', 
    ffirstName='$ffirstName', 
    flastName='$flastName', 
    fgender='$fgender', 
    gender='$fgender', 
    email='$femail', 
    femailVerified='$femailVerified', 
    mobile='$fphone', 
    fcoverInfoURL='$fcoverInfoURL', 
    img='$fphotoURL', 

    active=1, 
     facebook=1 
     WHERE id=$ssid"; 
    if ($conn->query($sql4) === TRUE) { 
      $_SESSION["user_id"] = $row1["id"]; 
     ?> 
      <script> 
     window.parent.location.href=("profile.php"); 

     </script> 

     <?php 

    } else { 

    echo "Error: " . $sql4 . "<br>" . $conn->error; 
    } 

     } 
     else 
     { 

    $password=generateRandomString(); 


    $sqlee = "INSERT INTO users (fidentifier,fprofileURL,fdisplayName,name,ffirstName,flastName,fgender,gender,email,femailVerified,mobile,fcoverInfoURL,img,active,facebook,password,date_joined) 
VALUES ('$fidentifier','$fprofileURL','$fdisplayName','$fdisplayName','$ffirstName','$flastName', 
'$fgender','$fgender','$femail','$femailVerified','$fphone','$fcoverInfoURL','$fphotoURL',1,1,'$password',NOW())"; 

    if ($conn->query($sqlee) === TRUE) { 
    $lastid = $conn->insert_id; 
    $_SESSION["user_id"] = $lastid; 
     ?> 
      <script> 
     window.parent.location.href=("profile.php"); 

     </script> 

     <?php 
    } 

    else { 
     echo "Error: " . $sql . "<br>" . $conn->error; 
    } 
     } 

     } 

    } 

    ?> 

然后在你的页面调用$ _SESSION [ “user_ID的”]这样

<?php 
if ($_SESSION["user_id"] != ""){$suserid=$_SESSION["user_id"];}else{$suserid="";} 
?> 

,当你需要用户登录就可以使用这样的事情

<?php 
if ($suserid !=""){ 
    //do this like a login user 
} 
if ($suserid ==""){ 
    echo "login to site by facebook <a href='facebook.php' >from here</a>"; 
} 
?> 

编辑:

不要忘记更改: include 'sql.php'; //将您的mysql连接重刑页

"base_url" => "https://yourdomain.com/handlers/hybridauth/", //你的域名hybridauth文件夹

"keys" => array ("id" => "YOUR_ID", "secret" => "YOUR_SECRET"), // YOUR_ID和YOUR_SECRET

1

您可以使用HybridAuth登录用户,将信息存储在您的应用程序中,并使用该信息编写您自己的验证系统。

使用这种方法时HibridAuth具有与Facebook comunicate只有一个登录名和比你可以验证用户的身份与自己的系统,避免无用的Facebook连接

1

好了,你的日志记录用户的策略是检查密码和电子邮件是正确的,然后让他们在会话。随着社会登录,你应该检查一下电子邮件是正确的 - 如果它是正确的:

  1. 检索用户记录(你可能需要检索,如果他已经登录的第一次之前创建一个新用户)
  2. 做同样的,与一般的登录(把电子邮件和IP哈希的会话,并从早期比较认证码)

所有请求应该被处理为共同邀请,只向社会提供的第一认证交互。