Authdog

Flask backend guide

Last updated Sep 11, 2026CI passing
View as Markdown

Just want one protected view? Start with the Flask quickstart.

authdog.flask caches session context on flask.g and exposes a require_auth decorator. Other Python frameworks: FastAPI, Django, Starlette, aiohttp. Hub: Python.

Availability and install

Unreleased on PyPI. Source-only in `packages/python`. Python 3.10+, Flask 3.0+, httpx 0.27+.

python -m pip install "./packages/python[flask]"

Configure

import os
from flask import Flask
from authdog.flask import Authdog

app = Flask(__name__)
authdog = Authdog(public_key=os.environ["PK_AUTHDOG"])

The public key is publishable. Construction rejects malformed keys and identity hosts outside the trusted HTTPS allowlist.

Session and gate

session() returns a typed context from any view and caches it on flask.g. Repeat calls in one request do not hit userinfo again. @require_auth is the 401 boundary.

Flask drives userinfo with asyncio.run on the sync view path.

@app.get("/")
def index():
    return {"authenticated": authdog.session().is_authenticated}

@app.get("/me")
@authdog.require_auth
def me():
    return authdog.session().user

@app.get("/logout")
def logout():
    return authdog.logout()

logout() (no request argument) returns a redirect Response that expires the cookie.

Works with blueprints as ordinary view decorators.

Shared rules

The resolver prefers authdog-session, then Authorization: Bearer <token>. fetch_user=False leaves is_authenticated false, so the decorator rejects. Apply authorization after the gate.

Self-hosted identity hosts need AUTHDOG_ALLOWED_IDENTITY_HOSTS.

Learn more