前言
关于jwt的介绍这里就不阐述了,相信你已经在网上看到了N篇介绍文章(你丫的讲那么多介绍到是告诉我怎么样呀!),关于php使用jwt的相关的使用却少的可怜,有的也看的模模糊糊,于是就自己整理,也方便自己以后进行查看。
jwt版本
php中jwt有3个版本:2.0、2.2、3.0。so!我们选择的是3.0的版本。别问为什么,你买电子产品都是买新不买旧呢。(说到这,想到了即将到手的iphonex,隐隐肾疼) ,看图可以发现3.0的版本支持更多参数。具体参数下面会解释
安装
1、使用composer安装
composer require lcobucci/jwt
2、从github上下载
依赖
- PHP 5.5+
- OpenSSL扩展
使用
参数解释
在使用之前先解释下上面参数的意思:
名称 | 解释 |
---|---|
iss (issuer) | issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者 |
sub (Subject) | 设置主题,类似于发邮件时的主题 |
aud (audience) | 接收jwt的一方 |
exp (expire) | token过期时间 |
nbf (not before) | 当前时间在nbf设定时间之前,该token无法使用 |
iat (issued at) | token创建时间 |
jti (JWT ID) | 对当前token设置唯一标示 |
生成token
使用秘钥签名
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Hmac\Sha256;
$builder = new Builder();
$signer = new Sha256();
// 设置发行人
$builder->setIssuer('http://example.com');
// 设置接收人
$builder->setAudience('http://example.org');
// 设置id
$builder->setId('4f1g23a12aa', true);
// 设置生成token的时间
$builder->setIssuedAt(time());
// 设置在60秒内该token无法使用
$builder->setNotBefore(time() + 60);
// 设置过期时间
$builder->setExpiration(time() + 3600);
// 给token设置一个id
$builder->set('uid', 1);
// 对上面的信息使用sha256算法签名
$builder->sign($signer, '签名key');
// 获取生成的token
$token = $builder->getToken();
使用RSA和ECDSA签名
RSA和ECDSA签名是基于公钥和私钥,所以必须使用私钥生成和验证使用
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();
验证token
秘钥解密
use Lcobucci\JWT\Signer\Hmac\Sha256;
$parse = (new Parser())->parse($token);
$signer = new Sha256();
$parse->verify($signer,'签名key');// 验证成功返回true 失败false
RSA和ECDSA
use Lcobucci\JWT\Signer\Rsa\Sha256;
use Lcobucci\JWT\Signer\Keychain;
$parse = (new Parser())->parse($token);
$signer = new Sha256();
var_dump($token->verify($signer, $keychain->getPublicKey('file://{公钥地址}'))
获取数据
因为数据部分可以直接获取到,不用解密。所以在验证token合法后直接读取即可,这也是不要在载体中存放敏感信息的原因。
$parse = (new Parser())->parse($token);
// 获取全部信息,返回一个数组,
var_dump($parse->getClaims());
// 获取单条信息
var_dump($parse->getClaim('aud'));
....
注意事项
关于jwt的使用大概就是这些。上面的代码在你使用的时候可能会出现两个问题:
1、命名空间错误
解决:不使用命名空间的话,使用require引入文件。如果使用命名空间出现错误,请检查命名空间的路径。
2、生成的token是一个对象
解决:(string)$token 将token强转成string
最后,如果上面写的有错误或者不足的地方,欢迎在下面留言给我。