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 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