Authdog

Status board

Last updated Oct 7, 2026
View as Markdown

The status board publishes component state on GET /. Internal notes stay on GET /notes, which rejects anonymous callers.

Clone starters/flask. SDK reference: Flask.

require_auth is the identity gate. A signed-in session is not a permission grant. Apply authorization after the gate.

What you need

Requirement Detail
Public key pk_... from the console
Environment Copy .env.example to .env and export PK_AUTHDOG
Secret key Never put sk_... in the service
Package Flask extra is source in authdog/web-sdk packages/python. It is not the authdog package on PyPI. Python 3.10+
Request Hosted sign-in stays in a browser. Call /notes with the authdog-session cookie or Authorization: Bearer

Run

python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
export PK_AUTHDOG=pk_...
flask --app main run --port 3000

GET / returns API (operational) and Account portal (degraded) with no session. GET /notes with a valid session returns note_7 (Account portal latency). Without a session it is rejected.

Public status and private notes

# main.py
import os

from authdog.flask import Authdog
from flask import Flask, jsonify

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

@app.get("/")
def index():
    return jsonify(
        {
            "components": [
                {"name": "API", "state": "operational"},
                {"name": "Account portal", "state": "degraded"},
            ]
        }
    )

@app.get("/notes")
@authdog.require_auth
def notes():
    return jsonify(
        {
            "caller": authdog.session().user,
            "notes": [
                {
                    "id": "note_7",
                    "component": "Account portal",
                    "text": "Identity host latency above 800ms.",
                }
            ],
        }
    )

The decorator works on blueprint views the same way. fetch_user=False leaves is_authenticated false, so the decorator rejects.