bugfix: logout behaviour fixed.

This commit is contained in:
2026-04-29 15:55:58 +03:30
parent 063a5faa56
commit 207e7fed75
2 changed files with 53 additions and 5 deletions

View File

@@ -136,6 +136,28 @@ export class AuthController {
return this.authService.getProfile(req.user.id); return this.authService.getProfile(req.user.id);
} }
// =========================
// LOGOUT
// =========================
@Post('logout')
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: 'Logout current user' })
@ApiResponse({ status: 200, description: 'Logout successful' })
async logout(@Req() req, @Res({ passthrough: true }) res: Response) {
const accessToken = req?.cookies?.accessToken;
if (accessToken) {
await this.authService.logout(accessToken);
}
this.clearAuthCookies(res);
return {
success: true,
message: 'Logged out successfully',
};
}
// ========================= // =========================
// TEST // TEST
// ========================= // =========================
@@ -174,4 +196,19 @@ export class AuthController {
path: '/', path: '/',
}); });
} }
private clearAuthCookies(res: Response) {
res.clearCookie('accessToken', {
httpOnly: true,
secure: false,
sameSite: 'lax',
path: '/',
});
res.clearCookie('refreshToken', {
httpOnly: true,
secure: false,
sameSite: 'lax',
path: '/',
});
}
} }

View File

@@ -181,11 +181,22 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
}, [router]); }, [router]);
const logout = useCallback(async () => { const logout = useCallback(async () => {
try {
// Important: clear auth cookies/session on the server first,
// otherwise middleware may still treat the user as authenticated.
await authApi.logout();
} catch (err) {
console.error('Logout API failed:', err);
} finally {
localStorage.clear(); localStorage.clear();
setUser(null); setUser(null);
setOrganizations([]); setOrganizations([]);
setCurrentOrganization(null); setCurrentOrganization(null);
router.push('/'); setError(null);
setIsAuthReady(true);
router.replace('/');
router.refresh();
}
}, [router]); }, [router]);
const selectOrganization = useCallback(async (orgId: string) => { const selectOrganization = useCallback(async (orgId: string) => {