源码和示例
jwt的构成
jwt分成三个部分,前两部分是base64转码的字符串,第三部分是通过前两部分和一个密钥,进行加密生成的。
第一部分$header基本上是固定的,不用改它,就是个声明。
$playload是涉及到的参数,都是自定义的,转成base64,基本上跟明文没什么区别。就是把自己想用的一些不是特别敏感的参数放上
$signature这部分才是重头戏,他是根据前两个+自己定义的secret加密成的token。之所以要用前两个参数参与加密,就是防止
前两个参数被私自篡改。如果被改之后,第三个参数由于加密规则不符,所以可以失败
生成JWT
下面是生成方法,最关键的是密钥部分
public function GetJwt()
{
$header = base64_encode(json_encode(array(
'typ' => 'JWT',
'alg' => 'HS256'
)));
$playload = base64_encode(json_encode(array(
"sub" => "",
"name" => "夏天",
"admin" => true
)));
$returnVal = $header.'.'.$playload;
$signature =hash_hmac('sha256', $returnVal, 'secret');
$returnVal.= '.'.$signature;
return $returnVal;
}
JWT验证
这部分只是示例的做了一下,意思大概就是,我按照第二部分$playload的参数,重新生成一次JWT,然后再跟接收到的这个JWT进行比对,看是否一致
public function CkJwt($opt)
{
$hashed_expected = $this-> GetJwt();
$result = $this -> hash_compare($opt, $hashed_expected);
return $result;
}
public function hash_compare($a, $b) {
$newJwt = $_SERVER['HTTP_HTTP_ACCESS_TOKEN'];
$originJwt = $this->CkJwt();
$return = $newJwt === $originJwt;
$this->ajaxReturn($return);
}