Token.php 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <?php
  2. /**
  3. * Author: luzheng.liu
  4. * Time: 2020/8/26 18:54
  5. */
  6. namespace app\common\until;
  7. use app\api\exception\ApiException;
  8. use app\api\exception\TokenException;
  9. use Firebase\JWT\ExpiredException;
  10. use Firebase\JWT\JWT;
  11. class Token {
  12. public $jwtKey = '';
  13. public $expTime = 3600;
  14. public function __construct() {
  15. $this->jwtKey = env('app.jwt_key','Rn4zNAX9e3li5dfI6mBuWLvbacTZqUrj');
  16. }
  17. public function getToken(int $userId,string $visitor = '') {
  18. $payload = [
  19. "iat" => time(),
  20. "exp" => time() + (3600 * 24 * 7),
  21. "userId" => $userId,
  22. "visitor"=> $visitor
  23. ];
  24. $token = JWT::encode($payload, $this->jwtKey);
  25. return $token;
  26. }
  27. public function decodeToken(): array {
  28. $token = request()->header('token') ?: request()->get('token');
  29. if (empty($token)) {
  30. throw new ApiException('token不能为空');
  31. }
  32. try {
  33. $decoded = JWT::decode($token, $this->jwtKey, ['HS256']);
  34. } catch (ExpiredException $e) {
  35. throw new TokenException('token到期,请刷新');
  36. } catch (\Exception $e) {
  37. throw new ApiException('token无效' . $e->getMessage());
  38. }
  39. $tokenInfo = (array)$decoded;
  40. if (time() - $tokenInfo['exp'] > 3600) {
  41. $GLOBALS['refreshToken'] = $this->getToken($tokenInfo['usrId']);
  42. }
  43. return (array)$decoded;
  44. }
  45. }