JWT做token校验,php部分

源码和示例

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" => "1234567890",
      "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);
}
 

随机浏览