AuthService.php 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. public function logout(): void
  42. {
  43. $user = Auth::user();
  44. $userModel = $this->userRepository->find($user->id);
  45. $userModel->tokens()->delete();
  46. }
  47. }