curl -X POST 'https://api.weir.ai/auth/logout' \
-H 'Content-Type: application/json' \
-d '{
"refreshToken": "refresh_token_123456789"
}'
{
"message": "Logout successful",
"status": "success"
}
Logout users and invalidate their refresh tokens
curl -X POST 'https://api.weir.ai/auth/logout' \
-H 'Content-Type: application/json' \
-d '{
"refreshToken": "refresh_token_123456789"
}'
{
"message": "Logout successful",
"status": "success"
}
curl -X POST 'https://api.weir.ai/auth/logout' \
-H 'Content-Type: application/json' \
-d '{
"refreshToken": "refresh_token_123456789"
}'
{
"message": "Logout successful",
"status": "success"
}
400 Bad Request
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters",
"details": {
"refreshToken": "Refresh token is required"
}
},
"status": "error"
}
401 Unauthorized
{
"error": {
"code": "INVALID_REFRESH_TOKEN",
"message": "Invalid refresh token",
"details": "The provided refresh token is invalid or already expired"
},
"status": "error"
}
429 Too Many Requests
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many logout requests",
"details": "Rate limit of 10 logout requests per minute exceeded"
},
"status": "error"
}
const logout = async (refreshToken) => {
try {
const response = await fetch('https://api.weir.ai/auth/logout', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ refreshToken })
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
// Clear stored tokens
localStorage.removeItem('accessToken');
localStorage.removeItem('refreshToken');
localStorage.removeItem('tokenExpiresAt');
return data;
} catch (error) {
console.error('Logout error:', error);
// Still clear local tokens even if server request fails
localStorage.clear();
throw error;
}
};
// Usage
await logout('refresh_token_123456789');
console.log('User logged out successfully');
Client-Side Logout
class AuthManager {
constructor() {
this.accessToken = localStorage.getItem('accessToken');
this.refreshToken = localStorage.getItem('refreshToken');
}
async logout() {
try {
// Call logout endpoint to invalidate server-side tokens
if (this.refreshToken) {
await fetch('https://api.weir.ai/auth/logout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ refreshToken: this.refreshToken })
});
}
} catch (error) {
console.warn('Server logout failed:', error);
// Continue with client-side cleanup
} finally {
// Always clear client-side tokens
this.clearTokens();
this.redirectToLogin();
}
}
clearTokens() {
localStorage.removeItem('accessToken');
localStorage.removeItem('refreshToken');
localStorage.removeItem('tokenExpiresAt');
this.accessToken = null;
this.refreshToken = null;
}
redirectToLogin() {
window.location.href = '/login';
}
}
Server-Side Logout
// Express.js example
app.post('/logout', async (req, res) => {
try {
const { refreshToken } = req.body;
// Call Weir AI logout endpoint
await fetch('https://api.weir.ai/auth/logout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ refreshToken })
});
// Clear server-side session
req.session.destroy();
res.json({ message: 'Logout successful', status: 'success' });
} catch (error) {
console.error('Logout error:', error);
res.status(500).json({ error: 'Logout failed' });
}
});
Token Invalidation
Session Security
Error Handling
Login/Logout Cycle
Automatic Logout
// Auto-logout on token expiration
function setupAutoLogout() {
const tokenExpiresAt = localStorage.getItem('tokenExpiresAt');
if (tokenExpiresAt) {
const timeUntilExpiry = tokenExpiresAt - Date.now();
if (timeUntilExpiry > 0) {
setTimeout(() => {
authManager.logout();
}, timeUntilExpiry);
}
}
}
Was this page helpful?