| name | workos-python |
| description | Integrate WorkOS AuthKit with Python applications. Adapts to Django, Flask, FastAPI, or vanilla Python. Server-side authentication with redirect-based OAuth flow. |
WorkOS AuthKit for Python
Step 1: Fetch SDK Documentation (BLOCKING)
STOP. Do not proceed until complete.
WebFetch: https://raw.githubusercontent.com/workos/workos-python/main/README.md
Also fetch the AuthKit quickstart for reference:
WebFetch: https://workos.com/docs/authkit/vanilla/python
The README is the source of truth for SDK API usage. If this skill conflicts with README, follow README.
Step 2: Detect Framework
Examine the project to determine which Python web framework is in use:
manage.py exists? → Django
settings.py has django imports? → Confirmed Django
Gemfile/requirements has 'fastapi'? → FastAPI
main.py has FastAPI() instance? → Confirmed FastAPI
requirements has 'flask'? → Flask
server.py/app.py has Flask() instance? → Confirmed Flask
None of the above? → Vanilla Python (use Flask quickstart pattern)
Adapt all subsequent steps to the detected framework. Do not force one framework onto another.
Step 3: Pre-Flight Validation
Package Manager Detection
uv.lock exists? → uv add
pyproject.toml has [tool.poetry]? → poetry add
Pipfile exists? → pipenv install
requirements.txt exists? → pip install (+ append to requirements.txt)
else → pip install
Environment Variables
Check .env for:
WORKOS_API_KEY - starts with sk_
WORKOS_CLIENT_ID - starts with client_
Step 4: Install SDK
Install using the detected package manager:
uv add workos python-dotenv
poetry add workos python-dotenv
pip install workos python-dotenv
If using requirements.txt, also append workos and python-dotenv to it.
Verify: python -c "import workos; print('OK')"
Step 5: Integrate Authentication
If Django
- Configure settings.py — add
import os + from dotenv import load_dotenv + load_dotenv() at top. Add WORKOS_API_KEY and WORKOS_CLIENT_ID from os.environ.get().
- Create auth views — create
auth_views.py (or add to existing views):
login_view: call SDK's get_authorization_url() with provider='authkit', redirect
callback_view: call authenticate_with_code() with the code param, store user in request.session
logout_view: flush session, redirect
- Add URL patterns — add
auth/login/, auth/callback/, auth/logout/ to urls.py
- Update templates — add login/logout links using
{% url %} tags
If Flask
Follow the quickstart pattern exactly:
- Initialize WorkOS client in
server.py / app.py:
from workos import WorkOSClient
workos = WorkOSClient(api_key=os.getenv("WORKOS_API_KEY"), client_id=os.getenv("WORKOS_CLIENT_ID"))
- Create
/login route — call workos.user_management.get_authorization_url(provider="authkit", redirect_uri="..."), redirect
- Create
/callback route — call workos.user_management.authenticate_with_code(code=code), set session cookie
- Create
/logout route — clear session, redirect
- Update home route — show user info if session exists
If FastAPI
- Initialize WorkOS client in main app file
- Create
/login endpoint — generate auth URL, return RedirectResponse
- Create
/callback endpoint — exchange code, store in session/cookie
- Create
/logout endpoint — clear session
- Use
Depends() for auth middleware on protected routes
If Vanilla Python (no framework detected)
Install Flask and follow the Flask pattern above. This matches the official quickstart.
Step 6: Environment Setup
Create/update .env with WorkOS credentials. Do NOT overwrite existing values.
WORKOS_API_KEY=sk_...
WORKOS_CLIENT_ID=client_...
Step 7: Verification Checklist
python -c "import workos; print('OK')"
python -c "
from dotenv import load_dotenv; import os; load_dotenv()
assert os.environ.get('WORKOS_API_KEY','').startswith('sk_'), 'Missing WORKOS_API_KEY'
assert os.environ.get('WORKOS_CLIENT_ID','').startswith('client_'), 'Missing WORKOS_CLIENT_ID'
print('Credentials OK')
"
Error Recovery
"ModuleNotFoundError: No module named 'workos'"
Re-run the install command for the detected package manager.
Django: "CSRF verification failed"
Auth callback receives GET requests from WorkOS. Ensure callback view uses GET, not POST. Or add @csrf_exempt.
Flask: Session not persisting
Ensure app.secret_key is set (required for Flask sessions).
Virtual environment not active
Check for .venv/, venv/, or poetry-managed environments. Activate before running install.