thinkphp 프레임 워 크 는 JWTtoken 을 사용 하 는 방법 에 대한 상세 한 설명 입 니 다.

6943 단어 thinkphpJWTtoken
본 고 는 thinkphp 프레임 워 크 가 JWTtoken 을 사용 하 는 방법 을 실례 로 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
간단 한 소개
1.JWT 소개:전 칭 JSON Web Token 은 JSON 의 개방 기준(RFC 7519)을 바탕 으로 전통 적 인 Cookie-Session 모델 을 token 방식 으로 대체 하여 각 서버,클 라 이언 트 가 정보 서명 검증 을 전달 하 는 데 사용 된다.
2.JWT 의 장점:
1:서버 에서 전통 적 인 세 션 정 보 를 저장 할 필요 가 없고 크로스 전송 문제 가 없 으 며 서버 비용 을 줄 일 수 있 습 니 다.
2:jwt 구성 이 간단 하고 적은 바이트 를 차지 하여 전송 하기에 편리 합 니 다.
3:json 형식 이 통용 되 고 서로 다른 언어 간 에 사용 할 수 있 습 니 다.
3.JWT 구성
1:jwt 는 세 부분 으로 구성 된다.
     머리(헤더)
     부하(payload)는 정의 정보 와 사용자 정의 정 보 를 포함 합 니 다.
     비자(서명)
2:구체 적 인 구성:
header:

{
 "typ": "JWT", //     jwt
 "alg": "HS256" //       SHA256
}

부하(payload)

{
 "iss": "http://www.helloweba.net",
 "aud": "http://www.helloweba.net",
 "iat": 1525317601,
 "nbf": 1525318201,
 "exp": 1525318201,
 "data": {
  "userid": 1,
  "username": "   "
 }
}

하중 은 표준 성명 과 기타 성명 두 부분 을 포함한다.
표준 성명:JWT 표준 에 규정된 성명 이지 만 반드시 작성 해 야 하 는 것 은 아니다.
표준 선언 필드:
이 JWT 를 접수 한 쪽
iss:jwt 발급 자
sub:jwt 대상 사용자
aud:jwt 를 받 는 쪽
exp:jwt 의 만 료 시간,만 료 시간 은 발급 시간 보다 커 야 합 니 다.
nbf:언제 까지,어느 시점 이후 에 만 접근 할 수 있 는 지 정의 합 니 다.
iat:jwt 의 발급 시간
jti:jwt 의 유일한 신분 표 지 는 주로 일회용 token 으로 사용 된다.
다운로드 하 다.

composer require firebase/php-jwt

extend 에서 token 클래스 만 들 기

namespace Token;
use think\Controller;
use think\facade\Request;
use Firebase\JWT\JWT;
/**token 
 * Class Token
 * @package app\api\Controller
 */
class Token
{
  /**
   *    token
   * @param array $data           
   * @param integer $exp_time    token       :    :7200=2  
   * @param string $scopes    token  ,     token
   * @return string
   */
  private $TokenKey = "123456";
  public function createToken($data="",$exp_time=0,$scopes=""){
    //JWT       ,        ;
    //iss: jwt   
    //sub: jwt      
    //aud:   jwt   
    //exp: jwt     ,             
    //nbf:          ,          
    //iat: jwt     
    //jti: jwt       ,         token。
    //    
    try {
      $key=$this->TokenKey;
      $time = time(); //    
      //$token['iss']=''; //      
      //$token['aud']=''; //   JWT   ,  
      $token['iat']=$time; //    
      $token['nbf']=$time; //(Not Before):          ,    time+30,      30      
      if($scopes){
        $token['scopes']=$scopes; //token  ,     token
      }
      if(!$exp_time){
        $exp_time=7200;//  =2    
      }
      $token['exp']=$time+$exp_time; //token    ,    2   
      if($data){
        $token['data']=$data; //     
      }
      $json = JWT::encode($token,$key);
      $returndata['status']="200";//
      $returndata['msg']='success';
      $returndata['token']= $json;//     
      return $returndata; //    
    }catch(\Firebase\JWT\ExpiredException $e){ //     
      $returndata['status']="104";//101=     
      $returndata['msg']=$e->getMessage();
      $returndata['data']="";//     
      return $returndata; //    
    }catch(\Exception $e) { //    
      $returndata['status']="199";//199=     
      $returndata['msg']=$e->getMessage();
      $returndata['data']="";//     
      return $returndata; //    
    }
  }
  /**
   *   token    ,    exp,nbf,iat  
   * @param string $jwt      token
   * @return string $msg     
   */
  public function checkToken($jwt){
    $key=$this->TokenKey;
    try {
      JWT::$leeway = 60;//      60,       
      $decoded = JWT::decode($jwt, $key, ['HS256']); //HS256  ,           
      $arr = (array)$decoded;
      $returndata['status']="200";//200=  
      $returndata['msg']="success";//
      $returndata['data']=$arr;//     
      return $returndata; //    
    } catch(\Firebase\JWT\SignatureInvalidException $e) { //     
      $returndata['status']="101";//101=     
      $returndata['msg']=$e->getMessage();
      $returndata['data']="";//     
      //return json_encode($returndata); //    
      //exit(json_encode($returndata));
      sendResponse($returndata,401,'Unauthorized');
    }catch(\Firebase\JWT\BeforeValidException $e) { //              
      $returndata['status']="102";
      $returndata['msg']=$e->getMessage();
      $returndata['data']="";//     
      sendResponse($returndata,401,'Unauthorized');
    }catch(\Firebase\JWT\ExpiredException $e) { // token  
      $returndata['status']="103";//103=     
      $returndata['msg']=$e->getMessage();
      $returndata['data']="";//     
      sendResponse($returndata,401,'Unauthorized');
    }catch(\Exception $e) { //    
      $returndata['status']="199";//199=     
      $returndata['msg']=$e->getMessage();
      $returndata['data']="";//     
      sendResponse($returndata,401,'Unauthorized');
    }
    //Firebase      throw new,        catch     ,catch       ,  token       Token     Token
  }

서명 발급 하 다

$jwtToken = new Token();
$tokenData = array(
  'openid' => $user->getId(),
  'uniacid' => $_W['uniacid'],
);
$token = $jwtToken->createToken($tokenData)

검증 하 다.

if (empty($_SERVER['HTTP_AUTHORIZATION']))
{
  $res['status']="201";
  $res['msg']="no token";
  $res['data']="";//     
  sendResponse($res,401,'Unauthorized');
}
$token = $_SERVER['HTTP_AUTHORIZATION'];
$jwtToken = new Token();
$checkToken = $jwtToken->checkToken($token);
$data = (array)$checkToken['data']['data'];

thinkpHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 는 ThinkPHP 프레임 워 크 를 기반 으로 한 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기