Django session middleware
Add hosted login and an encrypted session cookie to Django with ScalekitAuthMiddleware
Use scalekit.frameworks.django to add hosted login, an encrypted sk_session cookie, token refresh, and logout.
Typical flow: install the django extra, add settings and ScalekitAuthMiddleware, include the auth URLs, and decorate one view with @login_required. There is no ScalekitAuth instance to construct.
Requires scalekit-sdk-python 2.17.0 or later.
Register these URLs in the Scalekit Dashboard under Authentication > Redirects before you test. Paths have no trailing slash.
| Dashboard field | Must match |
|---|---|
| Redirect URI | SCALEKIT_REDIRECT_URI exactly, for example http://localhost:8000/callback |
| Post Logout Redirect URI | Absolute URL after full logout, for example http://localhost:8000/ |
| Initiate Login URL | Login path, for example http://localhost:8000/login |
Store credentials in environment variables. Never hard-code secrets.
SCALEKIT_ENVIRONMENT_URL=https://your-env.scalekit.comSCALEKIT_CLIENT_ID=skc_...SCALEKIT_CLIENT_SECRET=...COOKIE_ENCRYPTION_SECRET= # openssl rand -base64 32REDIRECT_URI=http://localhost:8000/callbackKeep COOKIE_ENCRYPTION_SECRET identical on every server instance.
Install the package
Section titled “Install the package”pip install "scalekit-sdk-python[django]"Protect a route
Section titled “Protect a route”import os
MIDDLEWARE = [ # ... "scalekit.frameworks.django.ScalekitAuthMiddleware",]
SCALEKIT_ENV_URL = os.environ["SCALEKIT_ENVIRONMENT_URL"]SCALEKIT_CLIENT_ID = os.environ["SCALEKIT_CLIENT_ID"]SCALEKIT_CLIENT_SECRET = os.environ["SCALEKIT_CLIENT_SECRET"]SCALEKIT_REDIRECT_URI = os.environ["REDIRECT_URI"]SCALEKIT_COOKIE_ENCRYPTION_SECRET = os.environ["COOKIE_ENCRYPTION_SECRET"]SCALEKIT_COOKIE_SECURE = False # set True behind HTTPSfrom django.urls import include, pathfrom . import views
urlpatterns = [ path("", include("scalekit.frameworks.django")), path("account", views.account),]from django.http import JsonResponsefrom scalekit.frameworks.django import login_required
@login_requireddef account(request): return JsonResponse({"sub": request.scalekit_user["sub"]})Open http://localhost:8000/account. A missing session returns 302 to /login, not a JSON 401.
request.scalekit_user is access-token claims, or None when the visitor is anonymous. sub is always present on an authenticated user. email appears only when you add it as a custom access-token claim.
ScalekitAuthMiddleware
Section titled “ScalekitAuthMiddleware”#__call__
Django middleware that reads sk_session on every request. Sets request.scalekit_user (None if unauthenticated) and writes a refreshed cookie about 10 seconds before expiry.
Add the class path to MIDDLEWARE. Required settings: SCALEKIT_REDIRECT_URI, SCALEKIT_COOKIE_ENCRYPTION_SECRET, and either SCALEKIT_CLIENT or SCALEKIT_ENV_URL + SCALEKIT_CLIENT_ID + SCALEKIT_CLIENT_SECRET.
Incoming request.
Downstream response, with a new or cleared session cookie when needed.
MIDDLEWARE = [ "scalekit.frameworks.django.ScalekitAuthMiddleware",]login_required
Section titled “login_required”#login_required
View decorator that requires request.scalekit_user. Redirects to SCALEKIT_LOGIN_PATH?returnTo=... when the user is missing. Requires ScalekitAuthMiddleware.
Django view to protect.
Wrapped view. Missing session → 302, never JSON 401.
from scalekit.frameworks.django import login_required
@login_requireddef billing(request): return JsonResponse({"sub": request.scalekit_user["sub"]})get_session
Section titled “get_session”#get_session
Read-only session lookup when you also need expires_at. Most views can read request.scalekit_user instead. Does not refresh or write a cookie.
Incoming request.
{"user": ..., "expires_at": ...}, or None. Never includes access_token, refresh_token, or id_token.
from scalekit.frameworks.django import get_session
session = get_session(request)if session: print(session["user"]["sub"], session["expires_at"])