AuthService.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. $user->tokens()->delete();
  23. $accessToken = $user->createToken('access_token', ['access'], Carbon::now()->addMinutes(15))->plainTextToken;
  24. $refreshToken = $user->createToken('refresh_token', ['refresh'], Carbon::now()->addDays(30))->plainTextToken;
  25. return ['access_token' => $accessToken, 'refresh_token' => $refreshToken];
  26. }
  27. public function refresh(RefreshTokenDto $refreshToken): ?array
  28. {
  29. $tokenModel = $this->personalAccessTokenRepository->findToken($refreshToken->token);
  30. if (!$tokenModel || $tokenModel->abilities[0] !== 'refresh' || $tokenModel->expires_at < Carbon::now()) {
  31. return null;
  32. }
  33. $user = $tokenModel->tokenable;
  34. if (!$user) {
  35. return null;
  36. }
  37. $user->tokens()->delete();
  38. $accessToken = $user->createToken('access_token', ['access'], Carbon::now()->addMinutes(15))->plainTextToken;
  39. $refreshToken = $user->createToken('refresh_token', ['refresh'], Carbon::now()->addDays(30))->plainTextToken;
  40. return ['access_token' => $accessToken, 'refresh_token' => $refreshToken];
  41. }
  42. public function logout(): void
  43. {
  44. $user = Auth::user();
  45. $userModel = $this->userRepository->find($user->id);
  46. $userModel->tokens()->delete();
  47. }
  48. }