1.安装
"lcobucci/jwt": "^3.4"版本php >= 5.6OpenSSL Extension// 安装$ composer require lcobucci/jwt
2. 一些参数说明
iss 【issuer】签发人(可以是,发布者的url地址)sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】受众人(可以是客户端的url地址,用作验证是否是指定的人或者url)exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号
3.简单封装
<?php/*** jwt封装的一个简单的类*/use Lcobucci\JWT\Configuration;use Lcobucci\JWT\Signer\Hmac\Sha256;use Lcobucci\JWT\Signer\Key\InMemory;use DateTimeImmutable;use Lcobucci\JWT\Token\Plain;use Lcobucci\JWT\Validation\RequiredConstraintsViolated;use Lcobucci\JWT\Validation\Constraint\SignedWith;class Service{/*** 配置秘钥加密* @return Configuration*/public static function getConfig(){$configuration = Configuration::forSymmetricSigner(// You may use any HMAC variations (256, 384, and 512)new Sha256(),// replace the value below with a key of your own!InMemory::base64Encoded('YWFhc0pOU0RLSkJITktKU0RiamhrMTJiM2Joa2ox')// You may also override the JOSE encoder/decoder if needed by providing extra arguments here);return $configuration;}/*** 签发令牌*/public static function createToken(){$config = self::getConfig();assert($config instanceof Configuration);$now = new DateTimeImmutable();$token = $config->builder()// 签发人->issuedBy('http://example.com')// 受众->permittedFor('http://example.org')// JWT ID 编号 唯一标识->identifiedBy('123')// 签发时间->issuedAt($now)// 在1分钟后才可使用// ->canOnlyBeUsedAfter($now->modify('+1 minute'))// 过期时间1小时->expiresAt($now->modify('+1 hour'))// 自定义uid 额外参数->withClaim('uid', 1)// 自定义header 参数->withHeader('foo', 'bar')// 生成token->getToken($config->signer(), $config->signingKey());//result://eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImZvbyI6ImJhciJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLmNvbSIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUub3JnIiwianRpIjoiNGYxZzIzYTEyYWEiLCJpYXQiOjE2MDk0Mjk3MjMsIm5iZiI6MTYwOTQyOTc4MywiZXhwIjoxNjA5NDMzMzIzLCJ1aWQiOjF9.o4uLWzZjk-GJgrxgirypHhXKkMMUEeL7z7rmvmW9Mnw//base64 decode://{"typ":"JWT","alg":"HS256","foo":"bar"}{"iss":"http:\/\/example.com","aud":"http:\/\/example.org","jti":"4f1g23a12aa","iat":1609429723,"nbf":1609429783,"exp":1609433323,"uid":1}[6cb`"*Gr0ńxoLreturn $token->toString();}/*** 解析令牌*/public static function parseToken(string $token){$config = self::getConfig();assert($config instanceof Configuration);$token = $config->parser()->parse('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImZvbyI6ImJhciJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLmNvbSIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUub3JnIiwianRpIjoiNGYxZzIzYTEyYWEiLCJpYXQiOjE2MDk0Mjk3MjMsIm5iZiI6MTYwOTQyOTc4MywiZXhwIjoxNjA5NDMzMzIzLCJ1aWQiOjF9.o4uLWzZjk-GJgrxgirypHhXKkMMUEeL7z7rmvmW9Mnw');assert($token instanceof Plain);dump($token->headers()); // Retrieves the token headersdump($token->claims()); // Retrieves the token claims}/*** 验证令牌*/public static function validationToken(string $token){$config = self::getConfig();assert($config instanceof Configuration);$token = $config->parser()->parse($token);assert($token instanceof Plain);//Lcobucci\JWT\Validation\Constraint\IdentifiedBy: 验证jwt id是否匹配//Lcobucci\JWT\Validation\Constraint\IssuedBy: 验证签发人参数是否匹配//Lcobucci\JWT\Validation\Constraint\PermittedFor: 验证受众人参数是否匹配//Lcobucci\JWT\Validation\Constraint\RelatedTo: 验证自定义cliam参数是否匹配//Lcobucci\JWT\Validation\Constraint\SignedWith: 验证令牌是否已使用预期的签名者和密钥签名//Lcobucci\JWT\Validation\Constraint\StrictValidAt: ::验证存在及其有效性的权利要求中的iat,nbf和exp(支持余地配置//Lcobucci\JWT\Validation\Constraint\LooseValidAt: 验证的权利要求iat,nbf和exp,当存在时(支持余地配置)//验证jwt id是否匹配$validate_jwt_id = new \Lcobucci\JWT\Validation\Constraint\IdentifiedBy('123');$config->setValidationConstraints($validate_jwt_id);//验证签发人url是否正确$validate_issued = new \Lcobucci\JWT\Validation\Constraint\IssuedBy('http://example.com');$config->setValidationConstraints($validate_issued);//验证客户端url是否匹配$validate_aud = new \Lcobucci\JWT\Validation\Constraint\PermittedFor('http://example.org');$config->setValidationConstraints($validate_aud);$constraints = $config->validationConstraints();try {$config->validator()->assert($token, ...$constraints);} catch (RequiredConstraintsViolated $e) {// list of constraints violation exceptions:var_dump($e->violations());}}}
4.使用
//生成tokenService::createToken();//解析tokenService::parseToken($token);//验证tokenService::validationToken($token);
