JWTトークン検証

<?phpの
名前空間のアプリ\指数\コントローラ。

\ Dbと思い使用します。
\セッションを考えて使用します。
\コントローラを考えて使用します。


//跨域处理
ヘッダ(「アクセス制御-許可起源:*」)。
ヘッダ(「アクセス制御-許可-方法:POST、GET、OPTIONS」)。
ヘッダ(「アクセス制御-許可起源:*」)。
ヘッダ( "とAccess-Control-Allow-Credentials:真");
ヘッダ( "アクセス制御-許可-方法:*");
ヘッダ( "アクセス制御-許可-ヘッダー:Content-Typeの、アクセス・トークン");
ヘッダ(「アクセス制御-露光-ヘッダ:*」)。

クラスメッセージコントローラ{延び
//ヘッド
プライベートヘッダ静的$ =配列(
「ALG」=>「HS256」、署名生成アルゴリズム//
「標準」=>「JWT」 //
);

生成されたメッセージダイジェストHMACを使用する場合//使用キー
プライベートキー静的$ = '123456';


/ **
*取得トークンJWT
* @param配列$ JWT負荷ペイロードフォーマット必ずしも
* [
* 'ISS' => 'jwt_admin'、//発行者JWT
* 'IAT' =>時間() 、// 発行時
* 'EXP' =>時間( )+ 7200、// 有効期限
* 'NBF' =>時間( )+ 60は、 プロセスがその時間より前に受信しません//トークン
* 'サブ' => 'www.admin.com'、ユーザーのための//
* 'JTI' => MD5( uniqid( 'JWT')。時間())//该トークン唯一标识
*]
* @returnブール値|文字列
* /
パブリック静的関数入手トークン(配列$ペイロード)
{
場合(IS_ARRAY($ペイロード))
{
$ base64header =自己:: base64UrlEncode(json_encode(自己:: $ヘッダ、JSON_UNESCAPED_UNICODE))。
$ base64payload =自己:: base64UrlEncode(json_encode($ペイロード、JSON_UNESCAPED_UNICODE));
$トークン= $ base64header $ base64payload自己::署名''。 ''($ base64header $はbase64payload、自己:: $キー、自己:: $ヘッダ[ 'ALG'] '');
$トークンを返します。
}他{
falseを返します。
}
}


/ **
*验证トークン是否有效、默认验证EXP、NBF、IAT时间
* @param文字列$トークン需要验证的トークン
* @returnブール|文字列
* /
パブリック静的機能verifyToken(文字列$トークン)
{
$トークン= ( ''、$トークン)を爆発。
(!数($トークン)= 3)であれば
、リターンはfalse;

一覧(base64header $、$ base64payload、$記号)= $トークンを;

//取得JWTアルゴリズム
$ base64decodeheader = json_decode(自己:: base64UrlDecode ($ base64header)、TRUE); // JSON_OBJECT_AS_ARRAYの対応をtrueに
IF([$ base64decodeheader(空'ALG']))
のリターンはfalse;

//署名検証
(自己::署名($ base64header場合 $ base64payload、自己:: $キー、$ base64decodeheader [ 'ALG'])== $記号)。 ''。! {
falseに復帰;
}

$ =ペイロードjson_decode(真の自己:: base64UrlDecode($ base64payload)、)の;

//発行時刻が現在時刻認証サーバに障害が発生したよりも大きい
(ISSET($ペイロード[ '場合 IAT'])&& $ペイロード[「IAT 「]>時間()){
falseに戻り;
}

//有効期限サーバ現在時刻認証が失敗した暁
IF(ISSET($ペイロード[ 'EXP'])&&ペイロード$ [ 'EXP'] <時間()){
falseに戻り;
}

トークンの//しない受信処理NBF時間前
(ISSET($ペイロード[ 'もし NBF '])&&ペイロード$ [' NBF「]>時間()){
falseに戻り;
}
$ペイロードを返す;
}


/ **
* base64UrlEncodeにbase64UrlEncode https://jwt.io/コーディング
必要* @param列$入力エンコードされた文字列
* @return列
* /
プライベート静的関数base64UrlEncode(文字列$ INPUT)
{
戻りstr_replace( '='、 ''、strtr(BASE64_ENCODE($ INPUT)、 '+ /'、 '-_'));
}

/ **
* base64UrlEncode HTTPS:// JWT。base64UrlEncodeで実装IO /デコーダ
* @paramの文字列$入力文字列をデコードします
* @return BOOL |文字列
* /
プライベート静的関数base64UrlDecode(文字列$入力)
{
$余り= strlenを($入力)%4。
IF($余り){
$ addlen = 4 - $剰余。
$入力=におけるSTR_Repeat( '='、$ addlen)。
}
戻りBASE64_DECODE(strtr($入力、 '-_'、 '+ /'));
}

/ **
* HMACSHA256签名https://jwt.io/中HMACSHA256签名实现
* @param列$入力为base64UrlEncode(ヘッダ)。 "" base64UrlEncode(ペイロード)
* @param列$キー
* @param列$ ALG算法方式
* @return混合
* /
プライベート静的関数署名(文字列$入力、文字列$キー、文字列$ ALG = 'HS256')
{
$ alg_config =配列(
'HS256' => 'SHA256'
)。
リターン自己:: base64UrlEncode(hash_hmac($ alg_config [$ ALG]、$入力、$キー、真));
}

//获取トークン
パブリック関数トークン($配列){
$ token_test =自己::入手トークン($配列)。
$ token_testを返します。
}

//验证トークン
パブリック関数token_yz($ token_test){
//对トークン进行验证签名
$ getPayload_test =自己:: verifyToken($ token_test)。
$ getPayload_testを返します。
}

時間()、 'JTI' => MD5(uniqid( 'JWT')時間())))。        戻りjson_encode(配列(            'UID' => $ユーザー[ 'ID']、



















'名前' => $ユーザー[ '名前']、
'トークン' => $トークン
));ダイ();
}

戻りjson_encode(アレイ(
'コード' => 0、
'MSG' =>「ログインまたはパスワード悪い"
));ダイ();
}  


}



おすすめ

転載: www.cnblogs.com/dream-meng/p/11809510.html