您现于de位置乃:亚博 > APP实例

亚博 2019-12-29 APP实例 72

APP使用JWT创建Token简单示例

依赖

环境:app 5.5 以上 + OpenSSL扩展


lcobucci/JWT

可使用composer 安装

composer require lcobucci/jwt

也可以直接到 GitHub下载

GitHub地址: https://github.com/lcobucci/jwt


参数解释



iss (issuer)issuer请求实体 可以乃发起请求de用户de信息 也可乃jwtde签发者
sub (Subject)设置主题 类似于发邮件时de主题
aud (audience)接收jwtde1方
exp (expire)token过时间期
nbf (not before)当前时间于nbf设定时间之前 该token无法使用
iat (issued at)token创建时间
jti (JWT ID)对当前token设置唯1标示


实例前准备

下面记录主要de依赖引用:

define('DS', DIRECTORY_SEPARATOR);
define('JWTPath', dirname(__FILE__) . DS);
include_once JWTPath . 'Builder.app';
include_once JWTPath . 'Signer.app';
include_once JWTPath . 'Signer' . DS . 'Keychain.app';
include_once JWTPath . 'Signer' . DS . 'Rsa.app';
include_once JWTPath . 'Signer' . DS . 'Rsa' . DS . 'Sha256.app';

当然它们里面还有更多de引用需要您自己加 这个于您调试时根据错误提示1个个补就好了 这里就不多写了.



实例

使用【lcobucci/JWT】产生 Token de方式有两种 于这里我只试验了第2种.

第1种:使用秘钥签名生成 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); 
// 设置生成tokende时间
$builder->setIssuedAt(time()); 
// 设置于60秒内该token无法使用
$builder->setNotBefore(time() + 60); 
// 设置过期时间
$builder->setExpiration(time() + 3600); 
// 给token设置1个id
$builder->set('uid', 1); 
// 对上面de信息使用sha256算法签名
$builder->sign($signer, '签名key');
// 获取生成detoken
$token = $builder->getToken();

验证 Token

use Lcobucci\JWT\Signer\Hmac\Sha256;
$parse = (new Parser())->parse($token);
$signer = new Sha256();
$parse->verify($signer,'签名key');// 验证成功返回true 失败false

第2种:使用RSA和ECDSA签名

RSA和ECDSA签名乃基于公钥和私钥,所以必须使用私钥生成和验证使用

use Lcobucci\JWT\Signer\Keychain;
// 注意这里使用desha256
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);
// 与上面不同de乃这里使用de4鷇e私钥 并提供私钥de地址
$builder->sign($signer, $keychain->getPrivateKey('file://{私钥地址}'));
$toekn = $builder->getToken();

最后还可以通过强制转换de形式来拿到您想要de纯字符串de Token


$toekn = (string) $builder->getToken();

和前端de交互可以放于返回de 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合法后直接读取即可 这也乃不要于载体中存放敏感信息de原因.

$parse = (new Parser())->parse($token);
// 获取全部信息 返回1个数组 
var_dump($parse->getClaims());
// 获取单条信息
var_dump($parse->getClaim('aud'));


评论