AuthController.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Requests\AuthRequest;
  4. use App\Http\Requests\RefreshTokenRequest;
  5. use Illuminate\Http\JsonResponse;
  6. use App\Http\Resources\AuthResource;
  7. use App\Services\AuthService;
  8. use Request;
  9. class AuthController extends Controller
  10. {
  11. public function __construct(protected AuthService $authService) {}
  12. public function login(AuthRequest $request): JsonResponse
  13. {
  14. $validated = $request->validated();
  15. $result = $this->authService->login(
  16. email: $validated["email"],
  17. password: $validated["password"],
  18. );
  19. if (!$result) {
  20. return $this->errorResponse(message: __("auth.failed"), code: 401);
  21. }
  22. $cookieName = $this->getCookieName($request);
  23. return $this->successResponse(
  24. payload: new AuthResource($result["payload"]),
  25. message: __("auth.logged_in"),
  26. )->withCookie(
  27. cookie(
  28. $cookieName,
  29. $result["refreshToken"],
  30. config("sanctum.rt_expiration") * 60,
  31. "/",
  32. config("session.domain"),
  33. config("session.secure"),
  34. true,
  35. false,
  36. "Lax",
  37. ),
  38. );
  39. }
  40. public function logout(Request $request): JsonResponse
  41. {
  42. $this->authService->logout();
  43. $cookieName = $this->getCookieName($request);
  44. return $this->successResponse(
  45. message: __("auth.logout"),
  46. )->withoutCookie($cookieName);
  47. }
  48. public function refresh(RefreshTokenRequest $request): JsonResponse
  49. {
  50. $cookieName = $this->getCookieName($request);
  51. $refresh_token = $request->cookie($cookieName);
  52. if (is_null($refresh_token)) {
  53. return $this->errorResponse(
  54. code: 403,
  55. )->withoutCookie($cookieName);
  56. }
  57. $result = $this->authService->refresh(
  58. $refresh_token
  59. );
  60. if (is_null($result)) {
  61. return $this->errorResponse(
  62. message: __("auth.unauthorized"),
  63. code: 403,
  64. )->withoutCookie($cookieName);
  65. }
  66. return $this->successResponse(
  67. payload: new AuthResource($result["payload"]),
  68. )->withCookie(
  69. cookie(
  70. $cookieName,
  71. $result["refreshToken"],
  72. config("sanctum.rt_expiration") * 60,
  73. "/",
  74. config("session.domain"),
  75. config("session.secure"),
  76. true,
  77. true,
  78. "Lax",
  79. ),
  80. );
  81. }
  82. /**
  83. * Resolves the dynamic cookie name based on the requesting application.
  84. */
  85. private function getCookieName(mixed $request): string
  86. {
  87. $appOrigin = $request->header("X-App-Origin", "default");
  88. return "{$appOrigin}_refresh_token";
  89. }
  90. }