Django integration#

Install#

Install with pip or conda/mamba/micromamba

pip install py-oidc-auth[django]
conda install -c conda-forge py-oidc-auth-django

Wiring URL patterns#

from django.http import HttpRequest, JsonResponse
from django.urls import path
from py_oidc_auth import DjangoOIDCAuth, IDToken

auth = DjangoOIDCAuth(
    client_id="my-client",
    client_secret="secret",
    discovery_url="https://idp.example.org/realms/demo/.well-known/openid-configuration",
    scopes="myscope profile email",
)

# Custom endpoint alongside the standard OIDC routes
async def auth_ports(request: HttpRequest) -> JsonResponse:
    """Expose valid redirect ports for client discovery."""
    return JsonResponse({"valid_ports": [8080, 8443]})

urlpatterns = [
    *auth.get_urlpatterns(),
    path("auth/v2/auth-ports", auth_ports),
]

Protecting views#

The wrapped view receives the validated token as an additional argument after the request object. Both sync and async views are supported.

from django.http import HttpRequest, JsonResponse
from py_oidc_auth import IDToken

@auth.required()
def me(request: HttpRequest, token: IDToken) -> JsonResponse:
    return JsonResponse({"sub": token.sub})

@auth.optional()
async def maybe_me(request: HttpRequest, token: IDToken) -> JsonResponse:
    if token is None:
        return JsonResponse({"anonymous": True})
    return JsonResponse({"sub": token.sub})