Web application
Implement Multi-App Authentication for web apps using Authorization Code flow with client_id and client_secret
Implement login, token management, and logout in your web application using the Authorization Code flow. Web applications have a backend server that can securely store a client_secret, allowing them to authenticate directly with Scalekit’s token endpoint. This guide covers initiating login from your backend, exchanging authorization codes for tokens, managing sessions with secure cookies, and implementing logout.
Prerequisites
Section titled “Prerequisites”Before you begin, ensure you have:
- A Scalekit account with an environment configured
- Your environment URL (
ENV_URL), e.g.,https://yourenv.scalekit.com - A web application registered in Scalekit with
client_idandclient_secret(Create one) - At least one redirect URL configured in Dashboard > Developers > Applications > [Your App] > Redirects
High-level flow
Section titled “High-level flow”Step-by-step implementation
Section titled “Step-by-step implementation”-
Initiate login or signup
Section titled “Initiate login or signup”Initiate login by redirecting the user to Scalekit’s hosted login page from your backend. Generate and store a
stateparameter before redirecting to validate the callback.Terminal window <ENV_URL>/oauth/authorize?response_type=code&client_id=<CLIENT_ID>&redirect_uri=<CALLBACK_URL>&scope=openid+profile+email+offline_access&state=<RANDOM_STATE>For detailed parameter definitions, see Initiate signup/login.
-
Handle the callback and complete login
Section titled “Handle the callback and complete login”After authentication, Scalekit redirects the user back to your callback endpoint with an authorization
codeand thestateyou sent.Your backend must:
- Validate the returned
statematches what you stored — this confirms the response is for your original request and prevents CSRF attacks - Handle any error parameters before processing
- Exchange the authorization code for tokens using your
client_secret
Terminal window POST <ENV_URL>/oauth/tokenContent-Type: application/x-www-form-urlencodedgrant_type=authorization_code&client_id=<CLIENT_ID>&client_secret=<CLIENT_SECRET>&code=<CODE>&redirect_uri=<CALLBACK_URL>{"access_token": "...","refresh_token": "...","id_token": "...","expires_in": 299} - Validate the returned
-
Manage sessions and token refresh
Section titled “Manage sessions and token refresh”Store tokens in secure cookies and validate the access token on each request. When access tokens expire, use the refresh token to obtain new ones without requiring the user to re-authenticate.
Token roles
- Access token — Short-lived token (default 5 minutes) for authenticated API requests
- Refresh token — Long-lived token to obtain new access tokens
- ID token — JWT containing user identity claims; required for logout
Store tokens in secure, HttpOnly cookies with appropriate path scoping to limit exposure.
When an access token expires, request new tokens:
Terminal window POST <ENV_URL>/oauth/tokenContent-Type: application/x-www-form-urlencodedgrant_type=refresh_token&client_id=<CLIENT_ID>&client_secret=<CLIENT_SECRET>&refresh_token=<REFRESH_TOKEN>Validate access tokens by verifying:
- Token signature using Scalekit’s public keys (JWKS endpoint)
issmatches your Scalekit environment URLaudincludes yourclient_idexpandiatare valid timestamps
Public keys for signature verification:
Terminal window <ENV_URL>/keys -
Implement logout
Section titled “Implement logout”Clear your application session and redirect to Scalekit’s logout endpoint to invalidate the shared session.
Your logout endpoint must:
- Extract the ID token before clearing cookies
- Clear application session cookies
- Redirect the browser to Scalekit’s logout endpoint
Terminal window <ENV_URL>/oidc/logout?id_token_hint=<ID_TOKEN>&post_logout_redirect_uri=<POST_LOGOUT_REDIRECT_URI>Configure backchannel logout URLs to receive notifications when a logout is performed from another application sharing the same user session.
Handle errors
Section titled “Handle errors”When authentication fails, Scalekit redirects to your callback URL with error parameters instead of an authorization code:
/callback?error=access_denied&error_description=User+denied+access&state=<STATE>Check for errors before processing the authorization code:
- Check if the
errorparameter exists in the URL - Log the
erroranderror_descriptionfor debugging - Display a user-friendly message
- Provide an option to retry login
Common error codes:
| Error | Description |
|---|---|
access_denied | User denied the authorization request |
invalid_request | Missing or invalid parameters |
server_error | Scalekit encountered an unexpected error |
(Optional) Use Scalekit Management APIs
Section titled “(Optional) Use Scalekit Management APIs”In addition to handling user authentication, web applications can call Scalekit’s Management APIs from the backend. These APIs allow your application to interact with Scalekit-managed resources such as users, organizations, memberships, and roles.
Typical use cases include:
- Fetching the currently authenticated user
- Listing organizations the user belongs to
- Managing organization membership or roles
Management APIs are Scalekit-owned APIs intended for server-side use only. Enable Management API access in your application:
- Go to app.scalekit.com
- Navigate to Developers > Applications
- Select your Web Application
- Enable Allow Scalekit Management API Access
What’s next
Section titled “What’s next”- Configure backchannel logout to receive notifications when a user logs out from another app
- Set up a custom domain for your authentication pages
- Add enterprise SSO to support SAML and OIDC with your customers’ identity providers