php使用jwt创建token简单示例
依赖
环境:php 5.5 以上 + openssl扩展
lcobucci/jwt
可使用composer 安装
composer require lcobucci/jwt
也可以直接到 github下载
github地址: https://github.com/lcobucci/jwt
参数解释
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设置唯一标示
实例前准备
下面记录主要的依赖引用:
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';
当然它们里面还有更多的引用需要你自己加,这个在你调试时根据错误提示一个个补就好了,这里就不多写了。
实例
使用【lcobucci/jwt】产生 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();
验证 token
use lcobucci\jwt\signer\hmac\sha256;$parse = (new parser())->parse($token);$signer = new sha256();$parse->verify($signer,'签名key');// 验证成功返回true 失败false
第二种:使用rsa和ecdsa签名
rsa和ecdsa签名是基于公钥和私钥,所以必须使用私钥生成和验证使用
use lcobucci\jwt\signer\keychain;// 注意这里使用的sha256use 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
$toekn = (string) $builder->gettoken();
和前端的交互可以放在返回的 json 格式中通过参数带过去,也可以存放在 header authorization 中。
验证 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')));))
获取数据
因为数据部分可以直接获取到,不用解密。所以在验证token合法后直接读取即可,这也是不要在载体中存放敏感信息的原因。
$parse = (new parser())->parse($token);// 获取全部信息,返回一个数组,var_dump($parse->getclaims());// 获取单条信息var_dump($parse->getclaim('aud'));
推荐教程:《php视频教程》
以上就是php使用jwt创建token的实例详解的详细内容。