使用User-Agent作为令牌

时间:2015-08-24 10:08:35

标签: 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($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中的用户是否为空。

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

我拯救了用户' mongodb收集了一系列令牌:

{
 ........ (Other params),
 "token" : {
    "d222b6a854d35c9c9584e695b623c468" : "nX0CuAraUQMGm5UsUWhUqZzgXZnapN",
    "8c27b0d66a7ea6cec5dda9979cc92bd3" : "swdYhSQN5el0x9Pmn2YXZuwckpmuHP",
    "28b825f204e7ebd320756bd6294a29c1" : "UFGd18db8W9gq1WDXgx4F9BZRVRY3K"
 }
}

此令牌数组包含: 密钥: MD5加密的User-Agent 值:随机字符串

这可以保留不同设备和浏览器的会话。

每次用户想要在网络上做某事我都会在路由中输入用户ID和令牌(值),并检查值是否正确:

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

if(isset($user->token[$uid]) && $user->token[$uid]==$token){
 ....
 return true;
}else{
 return false;
}

我认为问题出在User-Agent上。任何解决方案?

谢谢!

0 个答案:

没有答案