Authdog

Python · FastAPI

Authentication for FastAPI

A session resolver, a require_auth gate, and a logout handler for FastAPI, delivered as first-class dependencies that return a typed AuthdogContext. Validate Authdog sessions on every request, on the same wire as the Node SDKs.

One dependency
Add authdog.session as a dependency and any path operation gets a typed AuthdogContext. No middleware boilerplate.
One enforcement point
Depend on authdog.require_auth and unauthenticated requests are rejected with 401 before your handler runs.
Non-blocking by default
Session resolution runs on the event loop with an async httpx client, so gating a route never blocks the worker.
At most one userinfo call
The context is cached on request.state, so composing session and require_auth costs a single lookup.

Add the dependency

# main.py
from authdog.fastapi import Authdog

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

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

Gate routes with require_auth

# routes.py
@app.get("/me")
async def me(user=Depends(authdog.require_auth)):
    return user

Dependencies, not middleware

Everything FastAPI apps need

A drop-in session resolver, a require_auth gate, and a typed context, all expressed as FastAPI dependencies you compose, override, and test like any other.

01

A FastAPI dependency

Depends(authdog.session) resolves the request's session and returns a typed AuthdogContext with token, user, and is_authenticated for any path operation.

  • Typed AuthdogContext
  • Any path operation
02

require_auth gate

Depend on authdog.require_auth and FastAPI raises HTTPException(401) for unauthenticated requests, returning the user object otherwise. This is the security boundary.

  • 401 before your handler
  • Returns the verified user
03

At most one userinfo call

The resolved context is cached on request.state, so combining session and require_auth on one request makes a single outbound userinfo call.

  • Cached on request.state
  • One outbound call
04

Native to the dependency system

The bindings are plain FastAPI dependencies. Compose them with your own Depends(), override them in tests, and document them automatically in /docs.

  • Override in tests
  • Documented in /docs
05

Safe logout handler

authdog.logout(request) returns a RedirectResponse that expires the session cookie and redirects to a redirect_uri sanitized against open redirects.

  • Expires the cookie
  • Open-redirect safe
06

Same wire as Node

It mirrors @authdog/express and @authdog/fastify on the wire, so one Authdog environment serves your Node and FastAPI services interchangeably.

  • One environment
  • Node and Python together
01

Install

pip install 'authdog-fastapi[fastapi]'.

02

Create the client

Instantiate Authdog with your environment's public key.

03

Gate routes

Depend on require_auth where a user is required.

Add auth to your FastAPI app.

pip install 'authdog-fastapi[fastapi]', wire up the dependency, and gate your routes with require_auth today. Free to start, with secure defaults built in.