SessionVerifier.php 986 B

123456789101112131415161718192021222324252627
  1. <?php
  2. declare(strict_types=1);
  3. namespace app\miniapi\auth;
  4. use app\miniapi\model\MiniSession;
  5. use app\miniapi\model\MiniUser;
  6. use app\miniapi\exception\ApiException;
  7. final class SessionVerifier implements TokenVerifier
  8. {
  9. public function verify(string $token): Principal
  10. {
  11. if (!preg_match('/^[a-f0-9]{64}$/D', $token)) {
  12. throw new ApiException(40101, '登录状态已失效', 401);
  13. }
  14. $session = MiniSession::query()->where('token_hash', hash('sha256', $token))->whereNull('revoked_at')
  15. ->where('expires_at', '>', date('Y-m-d H:i:s'))->first();
  16. $user = $session ? MiniUser::query()->where('id', $session->user_id)->where('status', 1)->first() : null;
  17. if (!$user || ($user->appid === TestPhoneIdentityProvider::APP_ID && !TestPhoneIdentityProvider::enabled())) {
  18. throw new ApiException(40101, '登录状态已失效', 401);
  19. }
  20. return new Principal((string) $session->user_id);
  21. }
  22. }