thinkphp JWTtokenの使用

6353 ワード

概要
一:JWT紹介:全称JSON Web Token、JSONのオープンスタンダードに基づく(RFC 7519) ,従来のCookie-Sessionモードの代わりにtoken方式で、各サーバ、クライアントが情報署名検証を伝達するために使用される.
2:JWTのメリット:
1:サービス側は従来のセッション情報を保存する必要がなく、ドメイン間転送の問題がなく、サーバのオーバーヘッドを削減します.
2:jwt構成は簡単で、少ないバイトを占有し、伝送しやすい.
3:json形式は共通で、異なる言語間で使用できます.
3:JWT構成
1:jwtは3つの部分から構成されています.
     ヘッド     荷重(payload)には、いくつかの定義情報とカスタム情報が含まれています.     ビザ(signature)
2:具体的な構成:
header:
{   「typ」:「JWT」//宣言タイプjwt  「alg」:「HS 256」//署名アルゴリズムをSHA 256}荷重(payload)と宣言
{   "iss": "http://www.helloweba.net",   "aud": "http://www.helloweba.net",   "iat": 1525317601,   "nbf": 1525318201,   "exp": 1525318201,   "data": {     "userid": 1,     「username」:「李小龍」  } } 荷重には、標準宣言とその他の宣言の2つの部分が含まれます.
標準宣言: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'];