AuthController.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Requests\AuthRequest;
  4. use App\Http\Requests\ForgotPasswordRequest;
  5. use App\Http\Requests\RefreshTokenRequest;
  6. use App\Http\Requests\ResetPasswordRequest;
  7. use App\Http\Requests\VerifyPasswordCodeRequest;
  8. use Illuminate\Http\JsonResponse;
  9. use App\Http\Resources\AuthResource;
  10. use App\Services\AuthService;
  11. use Illuminate\Http\Request;
  12. class AuthController extends Controller
  13. {
  14. public function __construct(protected AuthService $authService) {}
  15. public function login(AuthRequest $request): JsonResponse
  16. {
  17. $validated = $request->validated();
  18. $result = $this->authService->login(
  19. email: $validated["email"],
  20. password: $validated["password"],
  21. origem: $validated["origem"]
  22. );
  23. if (!$result) {
  24. return $this->errorResponse(message: __("auth.failed"), code: 401);
  25. }
  26. $cookieName = $this->getCookieName($request);
  27. return $this->successResponse(
  28. payload: new AuthResource($result["payload"]),
  29. message: __("auth.logged_in"),
  30. )->withCookie(
  31. cookie(
  32. $cookieName,
  33. $result["refreshToken"],
  34. config("sanctum.rt_expiration") * 60,
  35. "/",
  36. config("session.domain"),
  37. config("session.secure"),
  38. true,
  39. false,
  40. "Lax",
  41. ),
  42. );
  43. }
  44. public function forgotPassword(ForgotPasswordRequest $request): JsonResponse
  45. {
  46. $validated = $request->validated();
  47. $sent = $this->authService->forgotPassword(
  48. email: $validated['email'],
  49. portal: $validated['portal'] ?? 'franchisee',
  50. );
  51. if (!$sent) {
  52. return $this->errorResponse(message: __('auth.email_not_found'), code: 422);
  53. }
  54. return $this->successResponse(message: __('auth.password_reset_sent'));
  55. }
  56. public function verifyPasswordCode(VerifyPasswordCodeRequest $request): JsonResponse
  57. {
  58. $validated = $request->validated();
  59. $valid = $this->authService->verifyPasswordCode(
  60. email: $validated['email'],
  61. code: $validated['code'],
  62. );
  63. if (!$valid) {
  64. return $this->errorResponse(message: __('auth.invalid_code'), code: 422);
  65. }
  66. return $this->successResponse(message: __('auth.code_verified'));
  67. }
  68. public function resetPassword(ResetPasswordRequest $request): JsonResponse
  69. {
  70. $validated = $request->validated();
  71. $reset = $this->authService->resetPassword(
  72. email: $validated['email'],
  73. code: $validated['code'],
  74. password: $validated['password'],
  75. );
  76. if (!$reset) {
  77. return $this->errorResponse(message: __('auth.invalid_code'), code: 422);
  78. }
  79. return $this->successResponse(message: __('auth.password_reset_success'));
  80. }
  81. public function logout(Request $request): JsonResponse
  82. {
  83. $this->authService->logout();
  84. $cookieName = $this->getCookieName($request);
  85. return $this->successResponse(
  86. message: __("auth.logout"),
  87. )->withoutCookie($cookieName);
  88. }
  89. public function refresh(RefreshTokenRequest $request): JsonResponse
  90. {
  91. $cookieName = $this->getCookieName($request);
  92. $refresh_token = $request->cookie($cookieName);
  93. if (is_null($refresh_token)) {
  94. return $this->errorResponse(
  95. code: 403,
  96. )->withoutCookie($cookieName);
  97. }
  98. $result = $this->authService->refresh(
  99. $refresh_token
  100. );
  101. if (is_null($result)) {
  102. return $this->errorResponse(
  103. message: __("auth.unauthorized"),
  104. code: 403,
  105. )->withoutCookie($cookieName);
  106. }
  107. return $this->successResponse(
  108. payload: new AuthResource($result["payload"]),
  109. )->withCookie(
  110. cookie(
  111. $cookieName,
  112. $result["refreshToken"],
  113. config("sanctum.rt_expiration") * 60,
  114. "/",
  115. config("session.domain"),
  116. config("session.secure"),
  117. true,
  118. true,
  119. "Lax",
  120. ),
  121. );
  122. }
  123. /**
  124. * Resolves the dynamic cookie name based on the requesting application.
  125. */
  126. private function getCookieName(mixed $request): string
  127. {
  128. $appOrigin = $request->header("X-App-Origin", "default");
  129. return "{$appOrigin}_refresh_token";
  130. }
  131. }