JwtAuth.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace qiniu\utils;
  12. use Firebase\JWT\Key;
  13. use qiniu\exceptions\AdminException;
  14. use qiniu\services\CacheService;
  15. use Firebase\JWT\JWT;
  16. use think\facade\Env;
  17. /**
  18. * Jwt
  19. * Class JwtAuth
  20. * @package crmeb\utils
  21. */
  22. class JwtAuth
  23. {
  24. /**
  25. * token
  26. * @var string
  27. */
  28. protected $token;
  29. /**
  30. * @var string
  31. */
  32. protected $app_key = 'crmeb_app_key';
  33. /**
  34. * 获取token
  35. * @param int $id
  36. * @param string $type
  37. * @param array $params
  38. * @return array
  39. */
  40. public function getToken(int $id, string $type, array $params = []): array
  41. {
  42. $host = app()->request->host();
  43. $time = time();
  44. $exp_time = strtotime('+ 7day');
  45. if (app()->request->isApp()) {
  46. $exp_time = strtotime('+ 30day');
  47. }
  48. if ($type == 'out') {
  49. $exp_time = strtotime('+ 1day');
  50. }
  51. $params += [
  52. 'iss' => $host,
  53. 'aud' => $host,
  54. 'iat' => $time,
  55. 'nbf' => $time,
  56. 'exp' => $exp_time,
  57. ];
  58. $params['jti'] = compact('id', 'type');
  59. $token = JWT::encode($params, Env::get('app.app_key', $this->app_key) ?: $this->app_key, 'HS256');
  60. return compact('token', 'params');
  61. }
  62. /**
  63. * 解析token
  64. * @param string $jwt
  65. * @return array
  66. */
  67. public function parseToken(string $jwt): array
  68. {
  69. $this->token = $jwt;
  70. [$headb64, $bodyb64, $cryptob64] = explode('.', $this->token);
  71. $payload = JWT::jsonDecode(JWT::urlsafeB64Decode($bodyb64));
  72. return [$payload->jti->id, $payload->jti->type, $payload->auth ?? ''];
  73. }
  74. /**
  75. * 验证token
  76. */
  77. public function verifyToken()
  78. {
  79. JWT::$leeway = 60;
  80. $key = new Key(Env::get('app.app_key', $this->app_key), 'HS256');
  81. JWT::decode($this->token, $key);
  82. $this->token = null;
  83. }
  84. /**
  85. * 获取token并放入令牌桶
  86. * @param int $id
  87. * @param string $type
  88. * @param array $params
  89. * @return array
  90. */
  91. public function createToken(int $id, string $type, array $params = [])
  92. {
  93. $tokenInfo = $this->getToken($id, $type, $params);
  94. $exp = $tokenInfo['params']['exp'] - $tokenInfo['params']['iat'] + 60;
  95. $res = CacheService::setTokenBucket(md5($tokenInfo['token']), ['uid' => $id, 'type' => $type, 'token' => $tokenInfo['token'], 'exp' => $exp], (int)$exp, $type);
  96. if (!$res) {
  97. throw new AdminException(ApiErrorCode::ERR_SAVE_TOKEN);
  98. }
  99. return $tokenInfo;
  100. }
  101. }