AuthService.php 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <?php
  2. namespace App\Services;
  3. use App\Repositories\UserRepositoryInterface;
  4. use App\Repositories\PersonalAccessTokenRepositoryInterface;
  5. use Carbon\Carbon;
  6. use App\DataTransferObjects\AuthDto;
  7. use App\DataTransferObjects\RefreshTokenDto;
  8. use Illuminate\Support\Facades\Auth;
  9. class AuthService
  10. {
  11. public function __construct(
  12. protected UserRepositoryInterface $userRepository,
  13. protected PersonalAccessTokenRepositoryInterface $personalAccessTokenRepository,
  14. ) {
  15. }
  16. public function login(AuthDto $credentials): ?array
  17. {
  18. if (!Auth::attempt($credentials->toArray())) {
  19. return null;
  20. }
  21. $user = $this->userRepository->findByEmail($credentials->email);
  22. $accessToken = $user->createToken('access_token', ['access'], Carbon::now()->addMinutes(15))->plainTextToken;
  23. $refreshToken = $user->createToken('refresh_token', ['refresh'], Carbon::now()->addDays(30))->plainTextToken;
  24. return ['access_token' => $accessToken, 'refresh_token' => $refreshToken];
  25. }
  26. public function refresh(RefreshTokenDto $refreshToken): ?array
  27. {
  28. $tokenModel = $this->personalAccessTokenRepository->findToken($refreshToken->token);
  29. if (!$tokenModel || $tokenModel->abilities[0] !== 'refresh' || $tokenModel->expires_at < Carbon::now()) {
  30. return null;
  31. }
  32. $user = $tokenModel->tokenable;
  33. if (!$user) {
  34. return null;
  35. }
  36. $user->tokens()->delete();
  37. $accessToken = $user->createToken('access_token', ['access'], Carbon::now()->addMinutes(15))->plainTextToken;
  38. $refreshToken = $user->createToken('refresh_token', ['refresh'], Carbon::now()->addDays(30))->plainTextToken;
  39. return ['access_token' => $accessToken, 'refresh_token' => $refreshToken];
  40. }
  41. }