2015-11-28 189 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哈希的會話,並從早期比較認證碼)

所有請求應該被處理爲共同邀請,只向社會提供的第一認證交互。