簡體   English   中英

HybridAuth身份驗證Cookie

[英]HybridAuth authentication cookie

我已經嘗試在我的現有Web應用程序中實現HybridAuth,該應用程序使用經典的電子郵件+密碼注冊和登錄,但是我仍然不知道如何使用HybridAuth對用戶進行身份驗證。

我現有的身份驗證系統

在我現有的登錄系統中,想要登錄的注冊用戶將其電子郵件和密碼發送到服務器。 如果電子郵件和密碼正確(我不以明文形式存儲用戶的密碼,但是密碼驗證過程與此問題無關),則服務器將創建用戶加密密碼和隨機密鑰的哈希。 此哈希存儲在cookie中 ,還用於創建身份驗證代碼,其中包含之前創建的哈希,用戶的電子郵件和IP地址全部哈希在一起。 身份驗證代碼存儲在用戶的會話中

當登錄的用戶嘗試訪問該站點時,服務器會從其cookie中獲取哈希值,並使用其電子郵件和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時,將對用戶進行身份驗證。

每次我使用社交身份驗證向我的應用發送請求時,網絡瀏覽器都必須等待大約1-2秒,才能接收到所請求的網頁/數據。 當我使用電子郵件密碼驗證時,網頁幾乎是服務器。

這使我認為HybridAuth每次想要驗證用戶身份時都必須與Facebook服務器通信,這非常慢。

我的問題是:HybridAuth是否可以為通過Facebook登錄的用戶創建某種身份驗證cookie,並在每次發送請求時無需與Facebook進行通信就對其進行安全身份驗證?

抱歉,我想解釋一個完整的身份驗證系統,因為它的整個概念可能是錯誤的/不安全的/過時的,我必須進行一些更改才能在HybridAuth中有效地使用它。

旁注:HybridAuth文檔很糟糕。

您可以使用HybridAuth來登錄用戶,將信息存儲在您的應用程序中,並使用該信息編寫自己的認證系統。

使用這種方法,HibridAuth只需與Facebook進行登錄即可進行通訊,然后您可以使用自己的系統驗證用戶的身份,從而避免了無用的Facebook連接

將此列添加到您的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. 檢索用戶記錄(您可能需要先創建一個新用戶,然后才能檢索該用戶是否首次登錄)
  2. 與普通登錄​​相同(將電子郵件和ip哈希放入會話中,並與之前的身份驗證代碼進行比較)

所有請求都應作為通用請求處理,並且僅與社交提供程序進行首次身份驗證進行交互。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM