Php 以用户代理作为令牌登录
我正在做一个网站项目(PHP、Fat-Free和mongodb),我只有一个用户有问题 当用户登录时,我调用此函数: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
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”。我根据收到的状态显示用户自定义消息。