JwtAuth.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <?php
  2. namespace utils;
  3. use Firebase\JWT\JWT;
  4. use think\facade\Env;
  5. use services\CacheServices;
  6. /**
  7. * Jwt
  8. * Class JwtAuth
  9. * @package crmeb\utils
  10. */
  11. class JwtAuth
  12. {
  13. /**
  14. * token
  15. * @var string
  16. */
  17. protected $token;
  18. /**
  19. * 获取token
  20. * @param int $uid
  21. * @param array|null $user
  22. * @param string $type
  23. * @param array $params
  24. * @return array
  25. */
  26. public function getToken (int $uid, ?array $user = null, string $type = '', array $params = []): array
  27. {
  28. $host = app()->request->host();
  29. $time = time();
  30. $params += [
  31. 'iss' => $host,
  32. 'aud' => $host,
  33. 'iat' => $time,
  34. 'nbf' => $time,
  35. 'exp' => strtotime('+ 168hour'),
  36. // 'exp' => strtotime('+ 3min'),
  37. 'user' => $user,
  38. ];
  39. $params['jti'] = [
  40. 'uid' => $uid,
  41. 'type' => $type
  42. ];
  43. $token = JWT::encode($params, Env::get('api.app_key', 'default'));
  44. return compact('token', 'params');
  45. }
  46. /**
  47. * 解析token
  48. * @param string $jwt
  49. * @return array
  50. */
  51. public function parseToken (string $jwt): array
  52. {
  53. $this->token = $jwt;
  54. list($headb64, $bodyb64, $cryptob64) = explode('.', $this->token);
  55. $payload = JWT::jsonDecode(JWT::urlsafeB64Decode($bodyb64));
  56. return [$payload->jti->uid, $payload->jti->type];
  57. }
  58. /**
  59. * 验证token
  60. * @param string $token
  61. * @return array
  62. */
  63. public function verifyToken (string $token): array
  64. {
  65. JWT::$leeway = 60;
  66. $jwt = JWT::decode($token, Env::get('api.app_key', 'default'), array('HS256'));
  67. $jwt = object_array($jwt);
  68. return $jwt;
  69. }
  70. /**
  71. * 获取token并放入令牌桶
  72. * @param int $uid
  73. * @param array|null $user
  74. * @param string $type
  75. * @return string
  76. */
  77. public function createToken (int $uid, ?array $user = null, string $type = ''): string
  78. {
  79. $tokenInfo = $this->getToken($uid, $user, $type);
  80. $exp = $tokenInfo['params']['exp'] - $tokenInfo['params']['iat'] + 60;
  81. CacheServices::setTokenBucket('auth:'.md5('yjbuy:' . $uid), ['uid' => $uid, 'type' => $type, 'token' => $tokenInfo['token'], 'exp' => $exp, 'user' => $tokenInfo['params']['user']], (int)$exp);
  82. return $tokenInfo['token'];
  83. }
  84. }