php jwt使用案例,PHP使用JWT创建Token的实例详解
iss (issuer)issuer請(qǐng)求實(shí)體,可以是發(fā)起請(qǐng)求的用戶的信息,也可是jwt的簽發(fā)者
sub (Subject)設(shè)置主題,類似于發(fā)郵件時(shí)的主題
aud (audience)接收jwt的一方
exp (expire)token過(guò)時(shí)間期
nbf (not before)當(dāng)前時(shí)間在nbf設(shè)定時(shí)間之前,該token無(wú)法使用
iat (issued at)token創(chuàng)建時(shí)間
jti (JWT ID)對(duì)當(dāng)前token設(shè)置唯一標(biāo)示
實(shí)例前準(zhǔn)備
下面記錄主要的依賴引用:define('DS', DIRECTORY_SEPARATOR);
define('JWTPath', dirname(__FILE__) . DS);
include_once JWTPath . 'Builder.php';
include_once JWTPath . 'Signer.php';
include_once JWTPath . 'Signer' . DS . 'Keychain.php';
include_once JWTPath . 'Signer' . DS . 'Rsa.php';
include_once JWTPath . 'Signer' . DS . 'Rsa' . DS . 'Sha256.php';
當(dāng)然它們里面還有更多的引用需要你自己加,這個(gè)在你調(diào)試時(shí)根據(jù)錯(cuò)誤提示一個(gè)個(gè)補(bǔ)就好了,這里就不多寫了。
實(shí)例
使用【lcobucci/JWT】產(chǎn)生 Token 的方式有兩種,在這里我只試驗(yàn)了第二種。
第一種:使用秘鑰簽名生成 tokenuse Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Hmac\Sha256;
$builder = new Builder();
$signer = new Sha256();
// 設(shè)置發(fā)行人
$builder->setIssuer('http://example.com');
// 設(shè)置接收人
$builder->setAudience('http://example.org');
// 設(shè)置id
$builder->setId('4f1g23a12aa', true);
// 設(shè)置生成token的時(shí)間
$builder->setIssuedAt(time());
// 設(shè)置在60秒內(nèi)該token無(wú)法使用
$builder->setNotBefore(time() + 60);
// 設(shè)置過(guò)期時(shí)間
$builder->setExpiration(time() + 3600);
// 給token設(shè)置一個(gè)id
$builder->set('uid', 1);
// 對(duì)上面的信息使用sha256算法簽名
$builder->sign($signer, '簽名key');
// 獲取生成的token
$token = $builder->getToken();
驗(yàn)證 Tokenuse Lcobucci\JWT\Signer\Hmac\Sha256;
$parse = (new Parser())->parse($token);
$signer = new Sha256();
$parse->verify($signer,'簽名key');// 驗(yàn)證成功返回true 失敗false
第二種:使用RSA和ECDSA簽名
RSA和ECDSA簽名是基于公鑰和私鑰,所以必須使用私鑰生成和驗(yàn)證使用use Lcobucci\JWT\Signer\Keychain;
// 注意這里使用的sha256
use Lcobucci\JWT\Signer\Rsa\Sha256;
$signer = new Sha256();
$keychain = new Keychain();
$builder = new Builder();
$builder->setIssuer('http://example.com');
$builder->setAudience('http://example.org');
$builder->setId('4f1g23a12aa', true);
$builder->setIssuedAt(time());
$builder->setNotBefore(time() + 60);
$builder->setExpiration(time() + 3600);
$builder->set('uid', 1);
// 與上面不同的是這里使用的是你的私鑰,并提供私鑰的地址
$builder->sign($signer, $keychain->getPrivateKey('file://{私鑰地址}'));
$toekn = $builder->getToken();
最后還可以通過(guò)強(qiáng)制轉(zhuǎn)換的形式來(lái)拿到你想要的純字符串的 Token
$toekn = (string) $builder->getToken();
和前端的交互可以放在返回的 JSON 格式中通過(guò)參數(shù)帶過(guò)去,也可以存放在 header Authorization 中。
驗(yàn)證 Token$signer = new \Lcobucci\JWT\Signer\Rsa\Sha256();
$keychain = new \Lcobucci\JWT\Signer\Keychain();
$parse = new \Lcobucci\JWT\Parser();
$parse->parse((string)$token);
var_dump($token->verify($signer, $keychain->getPublicKey(self::$dir . '/public.key')));
))
獲取數(shù)據(jù)
因?yàn)閿?shù)據(jù)部分可以直接獲取到,不用解密。所以在驗(yàn)證token合法后直接讀取即可,這也是不要在載體中存放敏感信息的原因。$parse = (new Parser())->parse($token);
// 獲取全部信息,返回一個(gè)數(shù)組,
var_dump($parse->getClaims());
// 獲取單條信息
var_dump($parse->getClaim('aud'));
推薦教程:《PHP視頻教程》
總結(jié)
以上是生活随笔為你收集整理的php jwt使用案例,PHP使用JWT创建Token的实例详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2020年安徽人游西递宏村免费吗?
- 下一篇: 高龄女性做试管婴儿比较差吗