php之jwt
jwt(json web token)是一种安全机制,在我们平时开发后台接口的时候有时候需要验证用户是否登录,这时候我们需要前台传一个参数回来后台来判断。如果前台传的是uid,后台用的session来实现验证。这个时候就会出现安全问题,后台也要花费空间来存session。这个时候我们就可以选择jwt来实现。
jwt原理:在用户登录的时候,如果验证通过了。我们后台生成一个token并返回给前台,前台保存起来,然后前台在需要传递用户的时候就向后台传递一个token参数。我们通过这个token来判断用户是否登录。token由头部、载体、签名通过一系列操作拼接在一起。下面直接上代码,这是一个自己写的很简单的jwt代码,网上有封装好的代码:
$token = $this->welfare_model->token($user['uid']);//把uid放在载体里面,也可以放其他
。。。。
public function token($uid)//生成token,然后传递给前台。
{
$key = 'qwer';//秘钥
$exp = time()+7*24*60*60;//时间戳
$head = base64_encode(json_encode(array('type'=>'JWT',"alg"=>"HS256"))); //头部
$Payload = base64_encode(json_encode(array('uid'=>$uid,'exp'=>$exp)));//载体
$Signature = ($head.'.'.$Payload);
$Signature = hash_hmac('sha256',$Signature,$key);//签名
$token = $head.'.'.$Payload.'.'.$Signature;//弄成最终的token
return $token;
}
。。。。
$token = $this->input->get('token',true);//获取前台返回的token
$flag = $this->welfare_model->jtoken($token);//验证
.。。。。
public function jtoken($token)//解析前台返回的token是否正确
{
$array = explode('.',$token);
$temp = $array[0].'.'.$array[1];
$Signature = hash_hmac('sha256',$temp,'qwer');//这里的加密方式可以通过头部解析出来
if($Signature == $array[2])//验证签名成功
{
$object = (json_decode(base64_decode($array[1])));//转换载体
$uid = $object->uid;//载体的uid
$exp = $object->exp;//载体的时间戳,验证是否过期,过期了要求用户重新登录
echo 'ok';
exit;
}
else//验证签名失败
{
echo 'error';
exit;
//...
}
}
上面就是验证的代码,如果用户有事没事就操作我们的产品,就可以不让载体里面的时间戳过期。我们后台可以在检测到前台的token正确的时候可以更新时间戳防止过期。感谢大神指点