JWT授權(quán)是目前流行的一種授權(quán)方式,它可以為前端和后端提供安全可靠的數(shù)據(jù)傳輸途徑,尤其是在調(diào)用API時(shí)更是必不可少。授權(quán)Token通過(guò)JWT規(guī)范生成,可以為每個(gè)請(qǐng)求提供授權(quán)標(biāo)識(shí)。當(dāng)然要使用此種方式,需要在php中編寫代碼來(lái)實(shí)現(xiàn)該功能。
在使用JWT授權(quán)之前,需要下載jwt-php庫(kù),可以通過(guò)Composer下載,也可以通過(guò)GitHub下載安裝。下面是使用composer安裝:
composer require firebase/php-jwt
生成授權(quán)Token的過(guò)程中,需要使用服務(wù)器端的密鑰進(jìn)行簽名。具體實(shí)現(xiàn)過(guò)程如下:
use \Firebase\JWT\JWT;
$key = "example_key";
$payload = array(
"iss" =>"http://example.org",
"aud" =>"http://example.com",
"iat" =>1356999524,
"nbf" =>1357000000
);
$jwt = JWT::encode($payload, $key);
上述代碼中,第一個(gè)參數(shù)是需要編碼的payload數(shù)據(jù),第二個(gè)參數(shù)是密鑰。
對(duì)于JWT授權(quán)而言,以下是常用設(shè)置:
默認(rèn)情況下,jwt-php會(huì)用base64對(duì)payload進(jìn)行編碼,但是也可以使用json數(shù)據(jù)格式進(jìn)行編碼,具體如下:
use \Firebase\JWT\JWT;
$key = "example_key";
$payload = array(
'sub' =>123,
'name' =>'John Doe',
'iat' =>1516239022,
'exp' =>1516239422,
'data' =>[
'userId' =>322,
'email' =>'test@example.com'
]
);
$jwt = JWT::encode($payload, $key, 'HS256', null, ['json']);
JWT授權(quán)也支持自定義header,如下:
use \Firebase\JWT\JWT;
$header = [
'typ' =>'JWT',
'alg' =>'HS256'
];
$key = "example_key";
$payload = array(
'sub' =>123,
'name' =>'John Doe',
'iat' =>1516239022,
'exp' =>1516239422,
'data' =>[
'userId' =>322,
'email' =>'test@example.com'
]
);
$jwt = JWT::encode($payload, $key, 'HS256', null, $header);
JWT授權(quán)也支持一些選項(xiàng),主要包括:簽名算法、過(guò)期時(shí)間、壓縮、生成時(shí)間等。以下是常用選項(xiàng)設(shè)置代碼:
use \Firebase\JWT\JWT;
$now = time();
$exp = $now + 60 * 60 * 24;//有效期為24小時(shí)
$header = [
'typ' =>'JWT',
'alg' =>'HS256'
];
$key = "example_key";
$payload = array(
'sub' =>123,
'name' =>'John Doe',
'iat' =>$now,
'exp' =>$exp,
'data' =>[
'userId' =>322,
'email' =>'test@example.com'
]
);
$jwt = JWT::encode($payload, $key, 'HS256', null, $header);
除以上方法外,jwt-php 還提供了驗(yàn)證token的方法,如下:
use \Firebase\JWT\JWT;
$key = "example_key";
$jwt = 'eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJIUzI1NiIg.eyJzdWIiOiAxMjMsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MzY2MjU2MzcsICJleHAiOiAxNTM2NjI1NjQ3LCAiZGF0YSI6IHtcbnVzZXJJZDogMzIyLFxuZW1haWw6ICJ0ZXN0QGV4YW1wbGUuY29tXG59IH0=.RaYIL2EZCYP4uBdt15lQZm3BGv1LAiqLSYN29i7kBEc=';
$json = json_encode(JWT::decode($jwt, $key, array('HS256')));
JWT授權(quán)是一個(gè)非常好的解決方案,它能夠?qū)崿F(xiàn)前后端之間的數(shù)據(jù)傳輸,也能提供有效的授權(quán)認(rèn)證。PHP語(yǔ)言支持JWT授權(quán),對(duì)于需要使用授權(quán)認(rèn)證的應(yīng)用程序而言,JWT授權(quán)是一種靠譜的授權(quán)認(rèn)證方式。