php

lcobucci/jwt的安装和使用

2023-09-17

1、安装 

   composer require lcobucci/jwt 3.3

2、封装

<?php

namespace tools\jwt;

 

use Lcobucci\JWT\Builder;

use Lcobucci\JWT\Signer\Key;

use Lcobucci\JWT\Signer\Hmac\Sha256;

use Lcobucci\JWT\ValidationData;

use Lcobucci\JWT\Parser;

 

class Token

{

    static private $_config=[

        'audience' => 'http://127.0.0.1/token',//接收人

        'id' => '1806',//token的唯一标识,这里只是一个简单示例

        'sign' => 'Mr.cao',//签名密钥

        'issuer' => 'http://127.0.0.1/user_id',//签发人

        'expire' => 3600*2 //有效期

    ];

 

    //生成token

    static public function getToken($k,$v)

    {

        $signer = new Sha256();

        $time = time();

 

        $token = (new Builder())->issuedBy(self::$_config['issuer'])  // 签发人

            ->permittedFor(self::$_config['audience']) // 接收人

            ->identifiedBy(self::$_config['id'], true) // 唯一标识 可以自己写,也可以随机生成

            ->issuedAt($time) // 签发时间

            ->canOnlyBeUsedAfter($time - 1) // 生效时间

            ->expiresAt($time + 3600) // 过期时间

            ->withClaim($k, $v) // 用户id

            ->getToken($signer, new Key(self::$_config['sign'])); // 生成token

        return (string)$token;

    }

     

    //验证token

    static public function verifyToken($token)

    {

        $signer = new Sha256();

        $token = (new Parser())->parse((string) $token);

        $data = new ValidationData();

 

        //验证签发人

        $data->setIssuer(self::$_config['issuer']);

        //验证接收人

        $data->setAudience(self::$_config['audience']);

        //验证唯一表示

        $data->setId(self::$_config['id']);

        //签发人   和上述验证

        if($token->verify($signer, self::$_config['sign']) && $token->validate($data)){

            return true;

        }else{

            return false;

        }

    }

 

    //从token中获取信息

    static public function getTokenMessege($token)

    {

        $res = self::verifyToken($token);

        if (!$res){

            return '无效的token';

        }

        $token = (new Parser())->parse((string)$token);

        return $token->getClaims();

    }

}

3、使用

use tools\jwt\Token;  //封装命名空间\类

 

//生成token

public function getToken(){

    $token = Token::getToken(5);

    return $token;

}

 

//测试token

public function testToken(Request $request){

    //接收token

    $token = $request->param('token');

    $data = Token::getTokenMessege($token);

    return $data;

}