Skip to content

Implement logout

Terminate user sessions across your application and Scalekit

When implementing logout functionality, you need to consider three session layers where user authentication state is maintained:

  1. Application session layer: Your application stores session tokens (access tokens, refresh tokens, ID tokens) in browser cookies. You control this layer completely.

  2. Scalekit session layer: Scalekit maintains a session for the user and stores their information. When users return to Scalekit’s authentication page, their information is remembered for a smoother experience.

  3. Identity provider session layer: When users authenticate with external providers (for example, Okta through enterprise SSO), those providers maintain their own sessions. Users won’t be prompted to sign in again if they’re already signed into the provider.

This guide shows you how to clear the application session layer and invalidate the Scalekit session layer in a single logout endpoint.

  1. Create a /logout endpoint in your application that handles the complete logout flow: extracting the ID token, generating the Scalekit logout URL (which points to Scalekit’s /oidc/logout endpoint), clearing session cookies, and redirecting to Scalekit.

    Express.js
    app.get('/logout', (req, res) => {
    // Step 1: Extract the ID token (needed for Scalekit logout)
    const idTokenHint = req.cookies.idToken;
    const postLogoutRedirectUri = 'http://localhost:3000/login';
    // Step 2: Generate the Scalekit logout URL (points to /oidc/logout endpoint)
    const logoutUrl = scalekit.getLogoutUrl(
    idTokenHint, // ID token to invalidate
    postLogoutRedirectUri // URL that scalekit redirects after session invalidation
    );
    // Step 3: Clear all session cookies
    res.clearCookie('accessToken');
    res.clearCookie('refreshToken');
    res.clearCookie('idToken'); // Clear AFTER using it for logout URL
    // Step 4: Redirect to Scalekit to invalidate the session
    res.redirect(logoutUrl);
    });

    The logout flow clears cookies AFTER extracting the ID token and generating the logout URL. This ensures the ID token is available for Scalekit’s logout endpoint.

  2. After users log out, Scalekit redirects them to the URL you specify in the post_logout_redirect_uri parameter. This URL must be registered in your Scalekit dashboard under Dashboard > Authentication > Redirects > Post Logout URL.

    Scalekit only redirects to URLs from your allow list. This prevents unauthorized redirects and protects your users. If you need different redirect URLs for different applications, you can register multiple post-logout URLs in your dashboard.

Which endpoint should I use for logout?

Use /oidc/logout (end_session_endpoint) for user logout functionality. This endpoint requires a browser redirect and clears the user’s session server-side.

Why must logout be a browser redirect?

You need to route to the /oidc/logout endpoint through a browser redirect, not with an API request. Redirecting the browser to Scalekit’s logout URL ensures the session cookie is sent automatically, so Scalekit can correctly locate and end the user’s session.

❌ Doesn’t work - API call from frontend:

fetch('https://your-env.scalekit.dev/oidc/logout', {
method: 'POST',
body: JSON.stringify({ id_token_hint: idToken })
});
// Session cookie is NOT included, Scalekit can't identify the session

✅ Works - Browser redirect:

const logoutUrl = scalekit.getLogoutUrl(idToken, postLogoutRedirectUri);
window.location.href = logoutUrl;
// Browser includes session cookies automatically

Why: Your user session is stored in an HttpOnly cookie. API requests from JavaScript or backend servers don’t include this cookie, so Scalekit can’t identify which session to terminate.

Session not clearing after logout?

If clicking login after logout bypasses the login screen and logs you back in automatically, check the following:

  1. Verify the logout method - Open browser DevTools → Network tab and trigger logout:

    • ✅ Type should show “document” (navigation)
    • ❌ Type should NOT show “fetch” or “xhr”
    • Check that the Cookie header is present in the request
  2. Check post-logout redirect URI - Ensure it’s registered in Dashboard > Authentication > Redirects > Post Logout URL.