php是最好的语言

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正确的时候可以更新时间戳防止过期。感谢大神指点

作者:xTao 分类:LNMP 浏览:2519 评论:0