Php 以用户代理作为令牌登录

Php 以用户代理作为令牌登录,php,mongodb,fat-free-framework,Php,Mongodb,Fat Free Framework,我正在做一个网站项目(PHP、Fat-Free和mongodb),我只有一个用户有问题 当用户登录时,我调用此函数: function login() { $user = F3::get('POST.user'); $pass = F3::get('POST.pass'); if($user!=""&&$pass!=""){ $bcrypt = new Bcrypt(12); $ismail = strrpos($u

我正在做一个网站项目(PHP、Fat-Free和mongodb),我只有一个用户有问题

当用户登录时,我调用此函数:

function login() {

    $user = F3::get('POST.user');
    $pass = F3::get('POST.pass');

    if($user!=""&&$pass!=""){

        $bcrypt = new Bcrypt(12);

        $ismail = strrpos($user, "@");

        $loginUser = new HT('user');


        if($ismail===false){
            $loginUser->load(array('nick' => $user));
        }else{
            $loginUser->load(array('email' => strtolower($user)));
        }

        if(!$loginUser->dry()){
            if($loginUser->isActive == true){
                $isValid = $bcrypt->verify($pass, $loginUser->password);  
                if($isValid){

                    $final_token = StringHelper::rand_str(30);

                    $tmp = $loginUser->token;

                    if(!is_array($tmp))
                        $tmp = array();

                    $cli_id = md5($_SERVER['HTTP_USER_AGENT']);


                    $tmp[$cli_id] = $final_token;

                    $loginUser->token = $tmp;

                    $user_id = $loginUser->_id."";

                    $loginUser->loginDate = new MongoDate();

                    $loginUser->updateFromId();

                    $isPremium = $loginUser->isPremium;

                    F3::set('user_id', $user_id);


                    if(isset($loginUser->preferences) && isset($loginUser->preferences['langPref'])){
                        $lang = $loginUser->preferences['langPref'];
                        echo json_encode(array("status"=>"OK","id"=>"$user_id","token"=>"$final_token","langPref"=>"$lang","schema"=>"$schema","isPremium"=>$isPremium));
                    }else{
                        echo json_encode(array("status"=>"OK","id"=>"$user_id","token"=>"$final_token","langPref"=>"en","schema"=>"$schema","isPremium"=>$isPremium));
                    }

                }else{
                    echo json_encode(array("status"=>self::NOT_EXIST));
                }
             }else{
                echo json_encode(array("status"=>self::NOT_ACTIVE));
             }
        }else{
            echo json_encode(array("status"=>self::NOT_EXIST));
        }

    }

}
注意:dry()函数检查用户在mongodb中是否为null

用户说,在他的办公室电脑不能做登录,他得到和“无效密码”错误。但他可以在任何其他计算机上登录该网站。 有时,如果他删除缓存或重置密码,就可以访问网站

我正在“用户”mongodb集合中保存一组令牌,如下所示:

{
 ........ (Other params),
 "token" : {
    "d222b6a854d35c9c9584e695b623c468" : "nX0CuAraUQMGm5UsUWhUqZzgXZnapN",
    "8c27b0d66a7ea6cec5dda9979cc92bd3" : "swdYhSQN5el0x9Pmn2YXZuwckpmuHP",
    "28b825f204e7ebd320756bd6294a29c1" : "UFGd18db8W9gq1WDXgx4F9BZRVRY3K"
 }
}
此令牌数组包含: 密钥:MD5加密用户代理 值:随机字符串

这将为不同的设备和浏览器保留会话

每当用户想在web上做一些事情时,我都会在路由中输入用户id和令牌(值),然后检查值是否正确:

....    
$uid = md5($_SERVER['HTTP_USER_AGENT']);

if(isset($user->token[$uid]) && $user->token[$uid]==$token){
 ....
 return true;
}else{
 return false;
}
我认为问题出在用户代理上。有解决办法吗


谢谢

返回消息“无效密码”的逻辑在哪里?另外:有没有不使用的原因?依靠用户代理进行身份验证看起来是一个可怕的想法:1)用户代理不是唯一的2)它很容易被欺骗。如果不想更改整个逻辑,至少可以将用户IP包含到md5哈希中。如果运气好的话,这甚至可以解决您的问题(如果该用户在两台机器上都有相同的用户代理,或者根本没有用户代理)。@xfra35我加入该项目时,该项目已经设置好了。。。所以我不知道为什么它不使用PHP会话。我将尝试使用用户IP。谢谢@ʰᵈˑ“无效密码”消息的逻辑是我返回状态:“NOT_EXIST”。我根据收到的状态显示用户自定义消息。