| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- <?php
- /**
- * 重庆赤晓店信息科技有限公司
- * https://www.chixiaodian.com
- * Copyright (c) 2023 赤店商城 All rights reserved.
- */
- namespace app\librarys;
- use yii\base\Component;
- use Yii;
- use Exception;
- use InvalidArgumentException;
- use app\models\Admin;
- use app\models\User;
- use app\models\SaasUser;
- /**
- * Class JwtComponent
- * @package app\librarys
- */
- class JwtComponent extends Component
- {
- /**
- * 签名算法常量
- */
- const ALGORITHM_HS256 = 'HS256';
- const ALGORITHM_HS384 = 'HS384';
- const ALGORITHM_HS512 = 'HS512';
- const ALGORITHM_RS256 = 'RS256';
- const ALGORITHM_RS384 = 'RS384';
- const ALGORITHM_RS512 = 'RS512';
- /**
- * 密钥
- * @var string
- */
- public $key = '';
- /**
- * 私钥
- * @var string
- */
- public $privateKey = '';
- /**
- * 公钥
- * @var string
- */
- public $publicKey = '';
- /**
- * @var string
- */
- public $headerKey = 'Authorization';
- /**
- * 偏移时间,秒
- * @var int
- */
- public $leeway = 0;
- /**
- * 签名算法
- * @var string
- */
- public $algorithm = self::ALGORITHM_HS256;
- private $admin = null;
- private $user = null;
- private $saasUser = null;
- /**
- * Jwt constructor.
- * @param array $config
- */
- public function __construct($config = [])
- {
- \Firebase\JWT\JWT::$leeway = $this->leeway;
- parent::__construct($config);
- }
- /**
- * 获取有效载荷
- * @return array
- * @throws Exception
- */
- public function getPayload()
- {
- $headers = Yii::$app->getRequest()->getHeaders();
- if ($headers->has($this->headerKey)) {
- $authorization = $headers->get($this->headerKey);
- if (strpos($authorization, 'Bearer ') === 0) {
- $token = (string) substr($authorization, 7);
- return $this->parse($token);
- }
- }
- throw new Exception('提取Token失败.');
- }
- /**
- * 解析token
- * @param string $token
- * @return array
- */
- public function parse(string $token)
- {
- switch ($this->algorithm) {
- case self::ALGORITHM_HS256:
- case self::ALGORITHM_HS384:
- case self::ALGORITHM_HS512:
- return (array) \Firebase\JWT\JWT::decode($token, $this->key, [$this->algorithm]);
- break;
- case self::ALGORITHM_RS256:
- case self::ALGORITHM_RS384:
- case self::ALGORITHM_RS512:
- return (array) \Firebase\JWT\JWT::decode($token, $this->publicKey, [$this->algorithm]);
- break;
- default:
- throw new InvalidArgumentException('无效的签名算法.');
- }
- }
- /**
- * 创建token
- * @param array $payload
- * @return string
- */
- public function createToken(array $payload)
- {
- switch ($this->algorithm) {
- case self::ALGORITHM_HS256:
- case self::ALGORITHM_HS384:
- case self::ALGORITHM_HS512:
- return \Firebase\JWT\JWT::encode($payload, $this->key, $this->algorithm);
- break;
- case self::ALGORITHM_RS256:
- case self::ALGORITHM_RS384:
- case self::ALGORITHM_RS512:
- return \Firebase\JWT\JWT::encode($payload, $this->privateKey, $this->algorithm);
- break;
- default:
- throw new InvalidArgumentException('无效的签名算法.');
- }
- }
- /**
- * @param Admin $admin
- */
- public function setAdmin(Admin $admin)
- {
- $this->admin = $admin;
- }
- /**
- * @return Admin|null
- */
- public function getAdmin()
- {
- return $this->admin;
- }
- /**
- * @param User $user
- */
- public function setUser(User $user)
- {
- $this->user = $user;
- }
- /**
- * @return User|null
- */
- public function getUser()
- {
- return $this->user;
- }
- /**
- * @param SaasUser $saasUser
- */
- public function setSaasUser(SaasUser $user)
- {
- $this->saasUser = $user;
- }
- /**
- * @return SaasUser|null
- */
- public function getSaasUser()
- {
- return $this->saasUser;
- }
- }
|