首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HybridAuth认证cookie

HybridAuth认证cookie
EN

Stack Overflow用户
提问于 2015-11-28 16:31:51
回答 3查看 662关注 0票数 2

我尝试将HybridAuth实现到我现有的web应用程序中,该应用程序使用了经典的email+password注册和登录,但我仍然不明白如何使用HybridAuth对用户进行身份验证。

我现有的身份验证系统

在我现有的登录系统中,一个想要登录的注册用户向服务器发送他的电子邮件和密码。如果电子邮件和密码是正确的(我不以明文存储用户的密码,但密码验证过程与此问题无关),服务器将创建用户加密密码的散列和随机密钥。此哈希存储在cookie中,还用于创建身份验证代码,其中包含前面创建的哈希、用户的电子邮件和IP地址。身份验证代码存储在用户的会话中。

当登录的用户试图访问站点时,服务器从他的cookie中获取散列,使用他的电子邮件和IP地址对其进行散列,并将其与先前存储在会话中的身份验证代码进行比较。如果代码匹配,则对用户进行身份验证,否则用户将被重定向到登录页。

新HybridAuth系统

到目前为止,我只通过Facebook实现了登录。当新用户单击“通过Facebook登录”按钮时,服务器执行多个脚本,将用户重定向到facebook,以便他能够授权我的应用程序,并在数据库中创建一个新的用户记录,其中包含用户facebook配置文件中的一些信息。此时,用户将注册并登录。

当这个用户试图与我的应用程序交互时,我必须以某种方式验证他的身份。我使用以下代码:

代码语言:javascript
复制
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秒才能接收到所请求的网页/数据。当我使用email+password身份验证时,网页几乎立即成为服务器。

这让我认为,每次HybridAuth想要对用户进行身份验证时,它都必须与Facebook服务器进行通信,这是极其缓慢的。

我的问题是: HybridAuth能否为通过Facebook登录并在每次发送请求时安全地身份验证而不必与Facebook通信的用户创建某种身份验证cookie?

很抱歉,有一个很长的问题,我想解释一下我的整个认证系统,因为它的整个想法可能是错误的/不安全的/过时的,为了在HybridAuth中有效地使用它,我必须做一些修改。

附带注意: HybridAuth文档很糟糕。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-07 09:36:10

将此列添加到mysql用户表中

代码语言:javascript
复制
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

代码语言:javascript
复制
      <?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“,如下所示

代码语言:javascript
复制
<?php
if ($_SESSION["user_id"] != ""){$suserid=$_SESSION["user_id"];}else{$suserid="";}
?>

当您需要用户登录时,您可以使用以下内容

代码语言:javascript
复制
<?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/", //到您的域混合文件夹

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

票数 1
EN

Stack Overflow用户

发布于 2015-12-01 23:09:27

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

使用这种方法,HibridAuth必须与facebook合并,只需登录一个登录名,并且您可以用自己的系统验证用户的身份,避免无用的facebook连接。

票数 1
EN

Stack Overflow用户

发布于 2015-12-07 09:53:39

好的,所以您登录用户的策略是检查密码和电子邮件是否正确,然后将它们保存在会话中。使用社交登录,您应该检查电子邮件是否正确-如果它是正确的:

  1. 检索用户记录(如果用户首次登录,则可能需要在检索之前创建一个新用户)
  2. 与普通登录相同(在会话中放置电子邮件和ip哈希,并与前面的身份验证代码进行比较)

所有请求都应作为通用请求处理,并且只与社会提供者交互以进行第一次身份验证。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33973665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档