UserTokenMiddleware.php 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <?php
  2. namespace app\common\middleware;
  3. use app\common\repositories\user\UserRepository;
  4. use app\Request;
  5. use ln\exceptions\AuthException;
  6. use ln\services\JwtTokenService;
  7. use Firebase\JWT\ExpiredException;
  8. use think\exception\ValidateException;
  9. use think\Response;
  10. use Throwable;
  11. class UserTokenMiddleware extends BaseMiddleware
  12. {
  13. /**
  14. * @param Request $request
  15. * @throws Throwable
  16. * @author xaboy
  17. * @day 2020-04-10
  18. */
  19. public function before(Request $request)
  20. {
  21. $force = $this->getArg(0, true);
  22. try {
  23. $token = trim($request->header('X-Token'));
  24. if (strpos($token, 'Bearer') === 0)
  25. $token = trim(substr($token, 6));
  26. if (!$token)
  27. throw new ValidateException('请登录');
  28. /**
  29. * @var UserRepository $repository
  30. */
  31. $repository = app()->make(UserRepository::class);
  32. $service = new JwtTokenService();
  33. try {
  34. $payload = $service->parseToken($token);
  35. } catch (ExpiredException $e) {
  36. $repository->checkToken($token);
  37. $payload = $service->decode($token);
  38. } catch (Throwable $e) {//Token 过期
  39. throw new AuthException('token 已过期');
  40. }
  41. if ('user' != $payload->jti[1])
  42. throw new AuthException('无效的 token');
  43. $user = $repository->get($payload->jti[0]);
  44. if (!$user)
  45. throw new AuthException('账号不存在');
  46. if (!$user['status'])
  47. throw new AuthException('账号已被禁用');
  48. } catch (Throwable $e) {
  49. if ($force)
  50. throw $e;
  51. $request->macro('isLogin', function () {
  52. return false;
  53. });
  54. $request->macros(['tokenInfo', 'uid', 'userInfo', 'token'], function () {
  55. throw new AuthException('请登录');
  56. });
  57. return;
  58. }
  59. $repository->updateToken($token);
  60. $request->macro('isLogin', function () {
  61. return true;
  62. });
  63. $request->macro('tokenInfo', function () use (&$payload) {
  64. return $payload;
  65. });
  66. $request->macro('token', function () use (&$token) {
  67. return $token;
  68. });
  69. $request->macro('uid', function () use (&$user) {
  70. return $user->uid;
  71. });
  72. $request->macro('userInfo', function () use (&$user) {
  73. return $user;
  74. });
  75. }
  76. public function after(Response $response)
  77. {
  78. // TODO: Implement after() method.
  79. }
  80. }