how to use lcobucci/jwt 4.0
1. 使用composer 下载
类库地址:https://packagist.org/packages/lcobucci/jwt
composer命令:composer require lcobucci/jwt
使用说明地址:https://lcobucci-jwt.readthedocs.io/en/latest/
使用版本是:”lcobucci/jwt”: “^4.1”
使用composer在php7.4版本下可能存在问题。
需要在php7.4中的php.ini中开启 extension=sodium
<?php
namespace app\controller;
use Illuminate\Support\Facades\Date;
use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;
use Lcobucci\JWT\UnencryptedToken;
use Lcobucci\JWT\Validation\RequiredConstraintsViolated;
/**
* Class JwtToken
* @package app\controller
* 这些是可用的设置器:
* setBuilderFactory(): 配置令牌构建器的创建方式
* setParser():配置自定义令牌解析器
* setValidator(): 配置自定义验证器
* setValidationConstraints(): 配置默认的验证约束集
* 检索组件:
* builder():检索令牌构建器(始终创建新实例)
* parser(): 检索令牌解析器
* signer(): 检索签名者
* signingKey(): 检索创建签名的密钥
* verificationKey(): 检索签名验证的密钥
* validator(): 检索令牌验证器
* validationConstraints(): 检索默认的验证约束集
*/
class JwtToken
{
private $config;
/**
* 构造初始化配置
* JwtToken constructor.
*/
public function __construct()
{
$config = Configuration::forSymmetricSigner(
// 您可以使用任何HMAC变体 (256, 384, and 512)
new Sha256(),
// 用您自己的密钥替换下面的值!这里使用CryptoKey来创建,地址:https://github.com/AndrewCarterUK/CryptoKey
// cryptokey generate / cryptokey generate --format=hex / cryptokey generate --entropy=64
InMemory::base64Encoded('rxZRlXZ9uyiznhlEO9OQYBVNcP+li+xer36XjFWBYWo=')
// 如果需要,您还可以在这里提供额外的参数来覆盖JOSE编码器/解码器
);
$this->config = $config;
}
/**
* @Method: 创建JWT
* @Author: CJH
* @DateTime: 2021/5/29 22:35
* @return string
*/
public function createToken($uid)
{
$config = $this->config;
assert($config instanceof Configuration);
// iss (issuer):签发人
// exp (expiration time):过期时间
// sub (subject):主题
// aud (audience):受众
// nbf (Not Before):生效时间
// iat (Issued At):签发时间
// jti (JWT ID):编号
$now = new \DateTimeImmutable();
$token = $config->builder()
// 配置颁发者(iss声明)
->issuedBy('http://example.com')
// 配置访问群体(aud声明)
->permittedFor('http://example.org')
// 配置id(jti声明)
->identifiedBy('1')
// 配置令牌发出的时间(iat声明)
->issuedAt($now)
// 配置可使用令牌的时间(nbf声明)
->canOnlyBeUsedAfter($now->modify('+1 minute'))
// 配置令牌的过期时间(exp claim)
->expiresAt($now->modify('+1 hour'))
// 配置一个名为“uid”的新声明
->withClaim('uid', $uid)
// 生成新令牌
->getToken($config->signer(), $config->signingKey());
// 创建令牌后,您就可以检索其数据并将其转换为字符串表示形式:
// $token->headers(); // Retrieves the token headers
// $token->claims(); // Retrieves the token claims
return $token->toString();
}
/**
* @Method: 解析token
* @Author: CJH
* @DateTime: 2021/5/29 22:35
* @param string $jwt
* @return string
*/
public function parseToken(string $jwt)
{
$config = $this->config;
assert($config instanceof Configuration);
$token = $config->parser()->parse(
$jwt
);
assert($token instanceof UnencryptedToken);
// 可通过以下获取信息
// $token->headers(); // Retrieves the token headers
// $token->claims(); // Retrieves the token claims
return $token->claims()->get('uid');
}
/**
* @Method: 验证令牌
* @Author: CJH
* @DateTime: 2021/5/29 23:37
* @param $jwt
* Lcobucci\JWT\Validation\Constraint\IdentifiedBy: 验证声明是否jti与预期值匹配
* Lcobucci\JWT\Validation\Constraint\IssuedBy: 验证声明iss是否被列为预期值
* Lcobucci\JWT\Validation\Constraint\PermittedFor: 验证声明是否aud包含预期值
* Lcobucci\JWT\Validation\Constraint\RelatedTo: 验证声明是否sub与预期值匹配
* Lcobucci\JWT\Validation\Constraint\SignedWith: 验证令牌是否使用预期的签名者和密钥签名
* Lcobucci\JWT\Validation\Constraint\StrictValidAt:验证存在及其有效性的权利要求中的iat,nbf和exp(支持余地配置)
* Lcobucci\JWT\Validation\Constraint\LooseValidAt: 验证声明iat, nbf, and exp, 当存在时(支持 leeway 配置)
* @return string
*/
public function validatorToken($jwt)
{
$config = $this->config;
$token = $config->parser()->parse($jwt);
assert($token instanceof UnencryptedToken);
$claims = $token->claims();
$jti = (string)$claims->get('jti');
$iss = (string)$claims->get('iss');
$aud = $claims->get('aud');
$nbf = $claims->get('nbf');
$exp = $claims->get('exp');
$now = new \DateTimeImmutable();
// 是否生效
if($nbf > $now){
return json_encode(array('data'=>'','msg'=>'未生效','code'=>0,'state'=>0));
}
// 是否过期
if($exp < $now){
return json_encode(array('data'=>'','msg'=>'已失效','code'=>0,'state'=>0));
}
//验证jwt id是否匹配
$validate_jwt_id = new \Lcobucci\JWT\Validation\Constraint\IdentifiedBy($jti);
// 验证签发人url是否正确
$validate_issued = new \Lcobucci\JWT\Validation\Constraint\IssuedBy($iss);
// 验证客户端url是否匹配
$validate_aud = new \Lcobucci\JWT\Validation\Constraint\PermittedFor($aud[0]);
// 需要注意这里!传入对应的验证数据
$config->setValidationConstraints($validate_jwt_id, $validate_issued, $validate_aud);
$constraints = $config->validationConstraints();
// 验证方法1
// try {
// $config->validator()->assert($token, ...$constraints);
// } catch (RequiredConstraintsViolated $e) {
// // list of constraints violation exceptions:
// var_dump($e->violations());
// }
// 验证方法2
if (!$config->validator()->validate($token, ...$constraints)) {
throw new \RuntimeException('No way!');
}
return json_encode(array('data'=>'','msg'=>'验证通过','code'=>1,'state'=>1));
}
}
<?php
namespace app\controller;
use Illuminate\Support\Facades\Date;
use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;
use Lcobucci\JWT\UnencryptedToken;
use Lcobucci\JWT\Validation\RequiredConstraintsViolated;
/**
* Class JwtToken
* @package app\controller
* 这些是可用的设置器:
* setBuilderFactory(): 配置令牌构建器的创建方式
* setParser():配置自定义令牌解析器
* setValidator(): 配置自定义验证器
* setValidationConstraints(): 配置默认的验证约束集
* 检索组件:
* builder():检索令牌构建器(始终创建新实例)
* parser(): 检索令牌解析器
* signer(): 检索签名者
* signingKey(): 检索创建签名的密钥
* verificationKey(): 检索签名验证的密钥
* validator(): 检索令牌验证器
* validationConstraints(): 检索默认的验证约束集
*/
class JwtToken
{
private $config;
/**
* 构造初始化配置
* JwtToken constructor.
*/
public function __construct()
{
$config = Configuration::forSymmetricSigner(
// 您可以使用任何HMAC变体 (256, 384, and 512)
new Sha256(),
// 用您自己的密钥替换下面的值!这里使用CryptoKey来创建,地址:https://github.com/AndrewCarterUK/CryptoKey
// cryptokey generate / cryptokey generate --format=hex / cryptokey generate --entropy=64
InMemory::base64Encoded('rxZRlXZ9uyiznhlEO9OQYBVNcP+li+xer36XjFWBYWo=')
// 如果需要,您还可以在这里提供额外的参数来覆盖JOSE编码器/解码器
);
$this->config = $config;
}
/**
* @Method: 创建JWT
* @Author: CJH
* @DateTime: 2021/5/29 22:35
* @return string
*/
public function createToken($uid)
{
$config = $this->config;
assert($config instanceof Configuration);
// iss (issuer):签发人
// exp (expiration time):过期时间
// sub (subject):主题
// aud (audience):受众
// nbf (Not Before):生效时间
// iat (Issued At):签发时间
// jti (JWT ID):编号
$now = new \DateTimeImmutable();
$token = $config->builder()
// 配置颁发者(iss声明)
->issuedBy('http://example.com')
// 配置访问群体(aud声明)
->permittedFor('http://example.org')
// 配置id(jti声明)
->identifiedBy('1')
// 配置令牌发出的时间(iat声明)
->issuedAt($now)
// 配置可使用令牌的时间(nbf声明)
->canOnlyBeUsedAfter($now->modify('+1 minute'))
// 配置令牌的过期时间(exp claim)
->expiresAt($now->modify('+1 hour'))
// 配置一个名为“uid”的新声明
->withClaim('uid', $uid)
// 生成新令牌
->getToken($config->signer(), $config->signingKey());
// 创建令牌后,您就可以检索其数据并将其转换为字符串表示形式:
// $token->headers(); // Retrieves the token headers
// $token->claims(); // Retrieves the token claims
return $token->toString();
}
/**
* @Method: 解析token
* @Author: CJH
* @DateTime: 2021/5/29 22:35
* @param string $jwt
* @return string
*/
public function parseToken(string $jwt)
{
$config = $this->config;
assert($config instanceof Configuration);
$token = $config->parser()->parse(
$jwt
);
assert($token instanceof UnencryptedToken);
// 可通过以下获取信息
// $token->headers(); // Retrieves the token headers
// $token->claims(); // Retrieves the token claims
return $token->claims()->get('uid');
}
/**
* @Method: 验证令牌
* @Author: CJH
* @DateTime: 2021/5/29 23:37
* @param $jwt
* Lcobucci\JWT\Validation\Constraint\IdentifiedBy: 验证声明是否jti与预期值匹配
* Lcobucci\JWT\Validation\Constraint\IssuedBy: 验证声明iss是否被列为预期值
* Lcobucci\JWT\Validation\Constraint\PermittedFor: 验证声明是否aud包含预期值
* Lcobucci\JWT\Validation\Constraint\RelatedTo: 验证声明是否sub与预期值匹配
* Lcobucci\JWT\Validation\Constraint\SignedWith: 验证令牌是否使用预期的签名者和密钥签名
* Lcobucci\JWT\Validation\Constraint\StrictValidAt:验证存在及其有效性的权利要求中的iat,nbf和exp(支持余地配置)
* Lcobucci\JWT\Validation\Constraint\LooseValidAt: 验证声明iat, nbf, and exp, 当存在时(支持 leeway 配置)
* @return string
*/
public function validatorToken($jwt)
{
$config = $this->config;
$token = $config->parser()->parse($jwt);
assert($token instanceof UnencryptedToken);
$claims = $token->claims();
$jti = (string)$claims->get('jti');
$iss = (string)$claims->get('iss');
$aud = $claims->get('aud');
$nbf = $claims->get('nbf');
$exp = $claims->get('exp');
$now = new \DateTimeImmutable();
// 是否生效
if($nbf > $now){
return json_encode(array('data'=>'','msg'=>'未生效','code'=>0,'state'=>0));
}
// 是否过期
if($exp < $now){
return json_encode(array('data'=>'','msg'=>'已失效','code'=>0,'state'=>0));
}
//验证jwt id是否匹配
$validate_jwt_id = new \Lcobucci\JWT\Validation\Constraint\IdentifiedBy($jti);
// 验证签发人url是否正确
$validate_issued = new \Lcobucci\JWT\Validation\Constraint\IssuedBy($iss);
// 验证客户端url是否匹配
$validate_aud = new \Lcobucci\JWT\Validation\Constraint\PermittedFor($aud[0]);
// 需要注意这里!传入对应的验证数据
$config->setValidationConstraints($validate_jwt_id, $validate_issued, $validate_aud);
$constraints = $config->validationConstraints();
// 验证方法1
// try {
// $config->validator()->assert($token, ...$constraints);
// } catch (RequiredConstraintsViolated $e) {
// // list of constraints violation exceptions:
// var_dump($e->violations());
// }
// 验证方法2
if (!$config->validator()->validate($token, ...$constraints)) {
throw new \RuntimeException('No way!');
}
return json_encode(array('data'=>'','msg'=>'验证通过','code'=>1,'state'=>1));
}
}
复制代码<?php namespace app\controller; use Illuminate\Support\Facades\Date; use Lcobucci\JWT\Configuration; use Lcobucci\JWT\Signer\Hmac\Sha256; use Lcobucci\JWT\Signer\Key\InMemory; use Lcobucci\JWT\UnencryptedToken; use Lcobucci\JWT\Validation\RequiredConstraintsViolated; /** * Class JwtToken * @package app\controller * 这些是可用的设置器: * setBuilderFactory(): 配置令牌构建器的创建方式 * setParser():配置自定义令牌解析器 * setValidator(): 配置自定义验证器 * setValidationConstraints(): 配置默认的验证约束集 * 检索组件: * builder():检索令牌构建器(始终创建新实例) * parser(): 检索令牌解析器 * signer(): 检索签名者 * signingKey(): 检索创建签名的密钥 * verificationKey(): 检索签名验证的密钥 * validator(): 检索令牌验证器 * validationConstraints(): 检索默认的验证约束集 */ class JwtToken { private $config; /** * 构造初始化配置 * JwtToken constructor. */ public function __construct() { $config = Configuration::forSymmetricSigner( // 您可以使用任何HMAC变体 (256, 384, and 512) new Sha256(), // 用您自己的密钥替换下面的值!这里使用CryptoKey来创建,地址:https://github.com/AndrewCarterUK/CryptoKey // cryptokey generate / cryptokey generate --format=hex / cryptokey generate --entropy=64 InMemory::base64Encoded('rxZRlXZ9uyiznhlEO9OQYBVNcP+li+xer36XjFWBYWo=') // 如果需要,您还可以在这里提供额外的参数来覆盖JOSE编码器/解码器 ); $this->config = $config; } /** * @Method: 创建JWT * @Author: CJH * @DateTime: 2021/5/29 22:35 * @return string */ public function createToken($uid) { $config = $this->config; assert($config instanceof Configuration); // iss (issuer):签发人 // exp (expiration time):过期时间 // sub (subject):主题 // aud (audience):受众 // nbf (Not Before):生效时间 // iat (Issued At):签发时间 // jti (JWT ID):编号 $now = new \DateTimeImmutable(); $token = $config->builder() // 配置颁发者(iss声明) ->issuedBy('http://example.com') // 配置访问群体(aud声明) ->permittedFor('http://example.org') // 配置id(jti声明) ->identifiedBy('1') // 配置令牌发出的时间(iat声明) ->issuedAt($now) // 配置可使用令牌的时间(nbf声明) ->canOnlyBeUsedAfter($now->modify('+1 minute')) // 配置令牌的过期时间(exp claim) ->expiresAt($now->modify('+1 hour')) // 配置一个名为“uid”的新声明 ->withClaim('uid', $uid) // 生成新令牌 ->getToken($config->signer(), $config->signingKey()); // 创建令牌后,您就可以检索其数据并将其转换为字符串表示形式: // $token->headers(); // Retrieves the token headers // $token->claims(); // Retrieves the token claims return $token->toString(); } /** * @Method: 解析token * @Author: CJH * @DateTime: 2021/5/29 22:35 * @param string $jwt * @return string */ public function parseToken(string $jwt) { $config = $this->config; assert($config instanceof Configuration); $token = $config->parser()->parse( $jwt ); assert($token instanceof UnencryptedToken); // 可通过以下获取信息 // $token->headers(); // Retrieves the token headers // $token->claims(); // Retrieves the token claims return $token->claims()->get('uid'); } /** * @Method: 验证令牌 * @Author: CJH * @DateTime: 2021/5/29 23:37 * @param $jwt * Lcobucci\JWT\Validation\Constraint\IdentifiedBy: 验证声明是否jti与预期值匹配 * Lcobucci\JWT\Validation\Constraint\IssuedBy: 验证声明iss是否被列为预期值 * Lcobucci\JWT\Validation\Constraint\PermittedFor: 验证声明是否aud包含预期值 * Lcobucci\JWT\Validation\Constraint\RelatedTo: 验证声明是否sub与预期值匹配 * Lcobucci\JWT\Validation\Constraint\SignedWith: 验证令牌是否使用预期的签名者和密钥签名 * Lcobucci\JWT\Validation\Constraint\StrictValidAt:验证存在及其有效性的权利要求中的iat,nbf和exp(支持余地配置) * Lcobucci\JWT\Validation\Constraint\LooseValidAt: 验证声明iat, nbf, and exp, 当存在时(支持 leeway 配置) * @return string */ public function validatorToken($jwt) { $config = $this->config; $token = $config->parser()->parse($jwt); assert($token instanceof UnencryptedToken); $claims = $token->claims(); $jti = (string)$claims->get('jti'); $iss = (string)$claims->get('iss'); $aud = $claims->get('aud'); $nbf = $claims->get('nbf'); $exp = $claims->get('exp'); $now = new \DateTimeImmutable(); // 是否生效 if($nbf > $now){ return json_encode(array('data'=>'','msg'=>'未生效','code'=>0,'state'=>0)); } // 是否过期 if($exp < $now){ return json_encode(array('data'=>'','msg'=>'已失效','code'=>0,'state'=>0)); } //验证jwt id是否匹配 $validate_jwt_id = new \Lcobucci\JWT\Validation\Constraint\IdentifiedBy($jti); // 验证签发人url是否正确 $validate_issued = new \Lcobucci\JWT\Validation\Constraint\IssuedBy($iss); // 验证客户端url是否匹配 $validate_aud = new \Lcobucci\JWT\Validation\Constraint\PermittedFor($aud[0]); // 需要注意这里!传入对应的验证数据 $config->setValidationConstraints($validate_jwt_id, $validate_issued, $validate_aud); $constraints = $config->validationConstraints(); // 验证方法1 // try { // $config->validator()->assert($token, ...$constraints); // } catch (RequiredConstraintsViolated $e) { // // list of constraints violation exceptions: // var_dump($e->violations()); // } // 验证方法2 if (!$config->validator()->validate($token, ...$constraints)) { throw new \RuntimeException('No way!'); } return json_encode(array('data'=>'','msg'=>'验证通过','code'=>1,'state'=>1)); } }
<?php
namespace app\controller;
use app\BaseController;
class Index extends BaseController
{
/**
* @Method: 创建JWT
* @Author: CJH
* @DateTime: 2021/5/30 21:05
* @return string
*/
public function createJWT()
{
$uid = input('param.uid');
$jwt = new JwtToken();
return $jwt->createToken($uid);
}
/**
* @Method: 从JWT中获取信息
* @Author: CJH
* @DateTime: 2021/5/30 21:05
* @return string
*/
public function parseJWT()
{
$token = input('post.jwt');
$jwt = new JwtToken();
return $jwt->parseToken($token);
}
/**
* @Method: 验证JWT是否合法
* @Author: CJH
* @DateTime: 2021/5/30 21:06
* @return int|string
*/
public function checkJWT(){
$token = input('post.jwt');
$jwt = new JwtToken();
return $jwt->validatorToken($token);
}
}
<?php
namespace app\controller;
use app\BaseController;
class Index extends BaseController
{
/**
* @Method: 创建JWT
* @Author: CJH
* @DateTime: 2021/5/30 21:05
* @return string
*/
public function createJWT()
{
$uid = input('param.uid');
$jwt = new JwtToken();
return $jwt->createToken($uid);
}
/**
* @Method: 从JWT中获取信息
* @Author: CJH
* @DateTime: 2021/5/30 21:05
* @return string
*/
public function parseJWT()
{
$token = input('post.jwt');
$jwt = new JwtToken();
return $jwt->parseToken($token);
}
/**
* @Method: 验证JWT是否合法
* @Author: CJH
* @DateTime: 2021/5/30 21:06
* @return int|string
*/
public function checkJWT(){
$token = input('post.jwt');
$jwt = new JwtToken();
return $jwt->validatorToken($token);
}
}
复制代码<?php namespace app\controller; use app\BaseController; class Index extends BaseController { /** * @Method: 创建JWT * @Author: CJH * @DateTime: 2021/5/30 21:05 * @return string */ public function createJWT() { $uid = input('param.uid'); $jwt = new JwtToken(); return $jwt->createToken($uid); } /** * @Method: 从JWT中获取信息 * @Author: CJH * @DateTime: 2021/5/30 21:05 * @return string */ public function parseJWT() { $token = input('post.jwt'); $jwt = new JwtToken(); return $jwt->parseToken($token); } /** * @Method: 验证JWT是否合法 * @Author: CJH * @DateTime: 2021/5/30 21:06 * @return int|string */ public function checkJWT(){ $token = input('post.jwt'); $jwt = new JwtToken(); return $jwt->validatorToken($token); } }
————————————————
版权声明:本文为CSDN博主「Chen_2017_Strive」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Chen_2017_Strive/article/details/117405469
评论(0)
暂无评论