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として使用される.
ダウンロード
extendでtokenクラスを作成する
発行する
検証#ケンショウ#
一: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'];