diff --git a/backend/app/Auth/UseCases/Logout/Logout.php b/backend/app/Auth/UseCases/Logout/Logout.php new file mode 100644 index 0000000..3cede1f --- /dev/null +++ b/backend/app/Auth/UseCases/Logout/Logout.php @@ -0,0 +1,17 @@ +sessionRepository->deleteByToken($token); + } +} diff --git a/backend/app/Http/Controllers/AuthController.php b/backend/app/Http/Controllers/AuthController.php index a9c1960..4fdaea2 100644 --- a/backend/app/Http/Controllers/AuthController.php +++ b/backend/app/Http/Controllers/AuthController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use App\Auth\UseCases\AuthenticateUser\AuthenticateUser; use App\Auth\UseCases\AuthenticateUser\AuthenticateUserRequest; use App\Auth\UseCases\CreateSession\CreateSession; +use App\Auth\UseCases\Logout\Logout; use App\Exceptions\BadRequestException; use App\Exceptions\UnauthorizedException; use App\Http\Middleware\AuthMiddleware; @@ -19,6 +20,7 @@ class AuthController extends Controller public function __construct( private AuthenticateUser $authenticateUser, private CreateSession $createSession, + private Logout $logout, ) {} public function login(Request $request): JsonResponse @@ -71,6 +73,28 @@ class AuthController extends Controller ]); } + public function logout(Request $request): JsonResponse + { + $token = $request->cookie(AuthMiddleware::COOKIE_NAME); + if (is_string($token) && $token !== '') { + $this->logout->execute($token); + } + + $response = new JsonResponse(null, 204); + + return $response->withCookie(Cookie::create( + name: AuthMiddleware::COOKIE_NAME, + value: '', + expire: 1, + path: '/', + domain: null, + secure: false, + httpOnly: true, + raw: false, + sameSite: Cookie::SAMESITE_LAX, + )); + } + /** * @return array{id: int, email: string} */ diff --git a/backend/routes/api.php b/backend/routes/api.php index d2e63d8..7d7d7c1 100644 --- a/backend/routes/api.php +++ b/backend/routes/api.php @@ -8,4 +8,5 @@ Route::post('/login', [AuthController::class, 'login']); Route::middleware(AuthMiddleware::class)->group(function (): void { Route::get('/me', [AuthController::class, 'me']); + Route::post('/logout', [AuthController::class, 'logout']); });