JwtComponent.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\librarys;
  8. use yii\base\Component;
  9. use Yii;
  10. use Exception;
  11. use InvalidArgumentException;
  12. use app\models\Admin;
  13. use app\models\User;
  14. use app\models\SaasUser;
  15. /**
  16. * Class JwtComponent
  17. * @package app\librarys
  18. */
  19. class JwtComponent extends Component
  20. {
  21. /**
  22. * 签名算法常量
  23. */
  24. const ALGORITHM_HS256 = 'HS256';
  25. const ALGORITHM_HS384 = 'HS384';
  26. const ALGORITHM_HS512 = 'HS512';
  27. const ALGORITHM_RS256 = 'RS256';
  28. const ALGORITHM_RS384 = 'RS384';
  29. const ALGORITHM_RS512 = 'RS512';
  30. /**
  31. * 密钥
  32. * @var string
  33. */
  34. public $key = '';
  35. /**
  36. * 私钥
  37. * @var string
  38. */
  39. public $privateKey = '';
  40. /**
  41. * 公钥
  42. * @var string
  43. */
  44. public $publicKey = '';
  45. /**
  46. * @var string
  47. */
  48. public $headerKey = 'Authorization';
  49. /**
  50. * 偏移时间,秒
  51. * @var int
  52. */
  53. public $leeway = 0;
  54. /**
  55. * 签名算法
  56. * @var string
  57. */
  58. public $algorithm = self::ALGORITHM_HS256;
  59. private $admin = null;
  60. private $user = null;
  61. private $saasUser = null;
  62. /**
  63. * Jwt constructor.
  64. * @param array $config
  65. */
  66. public function __construct($config = [])
  67. {
  68. \Firebase\JWT\JWT::$leeway = $this->leeway;
  69. parent::__construct($config);
  70. }
  71. /**
  72. * 获取有效载荷
  73. * @return array
  74. * @throws Exception
  75. */
  76. public function getPayload()
  77. {
  78. $headers = Yii::$app->getRequest()->getHeaders();
  79. if ($headers->has($this->headerKey)) {
  80. $authorization = $headers->get($this->headerKey);
  81. if (strpos($authorization, 'Bearer ') === 0) {
  82. $token = (string) substr($authorization, 7);
  83. return $this->parse($token);
  84. }
  85. }
  86. throw new Exception('提取Token失败.');
  87. }
  88. /**
  89. * 解析token
  90. * @param string $token
  91. * @return array
  92. */
  93. public function parse(string $token)
  94. {
  95. switch ($this->algorithm) {
  96. case self::ALGORITHM_HS256:
  97. case self::ALGORITHM_HS384:
  98. case self::ALGORITHM_HS512:
  99. return (array) \Firebase\JWT\JWT::decode($token, $this->key, [$this->algorithm]);
  100. break;
  101. case self::ALGORITHM_RS256:
  102. case self::ALGORITHM_RS384:
  103. case self::ALGORITHM_RS512:
  104. return (array) \Firebase\JWT\JWT::decode($token, $this->publicKey, [$this->algorithm]);
  105. break;
  106. default:
  107. throw new InvalidArgumentException('无效的签名算法.');
  108. }
  109. }
  110. /**
  111. * 创建token
  112. * @param array $payload
  113. * @return string
  114. */
  115. public function createToken(array $payload)
  116. {
  117. switch ($this->algorithm) {
  118. case self::ALGORITHM_HS256:
  119. case self::ALGORITHM_HS384:
  120. case self::ALGORITHM_HS512:
  121. return \Firebase\JWT\JWT::encode($payload, $this->key, $this->algorithm);
  122. break;
  123. case self::ALGORITHM_RS256:
  124. case self::ALGORITHM_RS384:
  125. case self::ALGORITHM_RS512:
  126. return \Firebase\JWT\JWT::encode($payload, $this->privateKey, $this->algorithm);
  127. break;
  128. default:
  129. throw new InvalidArgumentException('无效的签名算法.');
  130. }
  131. }
  132. /**
  133. * @param Admin $admin
  134. */
  135. public function setAdmin(Admin $admin)
  136. {
  137. $this->admin = $admin;
  138. }
  139. /**
  140. * @return Admin|null
  141. */
  142. public function getAdmin()
  143. {
  144. return $this->admin;
  145. }
  146. /**
  147. * @param User $user
  148. */
  149. public function setUser(User $user)
  150. {
  151. $this->user = $user;
  152. }
  153. /**
  154. * @return User|null
  155. */
  156. public function getUser()
  157. {
  158. return $this->user;
  159. }
  160. /**
  161. * @param SaasUser $saasUser
  162. */
  163. public function setSaasUser(SaasUser $user)
  164. {
  165. $this->saasUser = $user;
  166. }
  167. /**
  168. * @return SaasUser|null
  169. */
  170. public function getSaasUser()
  171. {
  172. return $this->saasUser;
  173. }
  174. }