Início rápido

O caminho curto para validar a integração é usar GOVBR_PROVIDER=fake. O mesmo adapter e o mesmo callback funcionam depois com o provedor oficial.

Aplicação FastAPI

Instale o adapter e, para o fluxo local, o extra FakeGov:

pip install "govbr-auth[fastapi,fake]"

Salve myapp.py:

from pathlib import Path

from dotenv import load_dotenv
from fastapi import FastAPI
from fastapi.responses import JSONResponse

from govbr_auth.fastapi import AuthContext, GovBrAuth
from govbr_auth.runtime import GovBrRuntimeSettings

async def authenticated(context: AuthContext) -> JSONResponse:
    return JSONResponse({"authenticated": True})

load_dotenv(dotenv_path=Path.cwd() / ".env", override=False)
settings = GovBrRuntimeSettings.from_environment()
app = FastAPI()
auth = GovBrAuth(settings=settings, on_success=authenticated)
app.include_router(auth.router)

O adapter registra /auth/govbr/login e o callback. No modo fake, as rotas do provedor e a página demo na raiz / são montadas no mesmo app. O launcher python -m govbr_auth.fake é um atalho para iniciar esse perfil completo.

Aplicação Django

Instale:

pip install "govbr-auth[django]"

Salve django_app.py:

from pathlib import Path

from dotenv import load_dotenv
from django.http import JsonResponse

from govbr_auth.django import GovBrAuth
from govbr_auth.runtime import GovBrRuntimeSettings

SECRET_KEY = "fake-local-only"
DEBUG = True
ALLOWED_HOSTS = ["127.0.0.1"]
ROOT_URLCONF = __name__

def authenticated(context, request):
    return JsonResponse({"authenticated": True})

load_dotenv(dotenv_path=Path.cwd() / ".env", override=False)
settings = GovBrRuntimeSettings.from_environment()
auth = GovBrAuth(settings=settings, on_success=authenticated)
urlpatterns = auth.urlpatterns

Execute com python -m django runserver 127.0.0.1:8000 --settings=django_app.

Aplicação Flask

Instale:

pip install "govbr-auth[flask]"

Salve flask_app.py:

from pathlib import Path

from dotenv import load_dotenv
from flask import Flask, jsonify

from govbr_auth.flask import GovBrAuth
from govbr_auth.runtime import GovBrRuntimeSettings

load_dotenv(dotenv_path=Path.cwd() / ".env", override=False)
settings = GovBrRuntimeSettings.from_environment()
app = Flask(__name__)

def authenticated(context, request):
    return jsonify({"authenticated": True})

auth = GovBrAuth(settings=settings, on_success=authenticated)
auth.register(app)

Execute com flask --app flask_app:app run --port 5000.

Testar com FakeGov

Crie um arquivo fictício fake-users.local.json e configure apenas:

{"users": [{"cpf": "11122233344", "password": "senha-ficticia", "name": "Usuário Fake", "email": "fake@example.test"}]}
GOVBR_PROVIDER=fake
GOVBR_FAKE_USERS_FILE=./fake-users.local.json

No POSIX, use export GOVBR_FAKE_USERS_FILE="$PWD/fake-users.local.json"; no PowerShell, use $env:GOVBR_FAKE_USERS_FILE = "$PWD\fake-users.local.json".

Execute sua aplicação e abra /auth/govbr/login. Para abrir a página visual de demonstração e iniciar o fluxo completo em um launcher dedicado, execute:

pip install "govbr-auth[fastapi,fake]"
python -m govbr_auth.fake

O launcher publica a demo na raiz / em loopback e não deve ser exposto na rede. /govbr-auth-demo permanece como alias. Abra a página e clique em Entrar com GOV.BR. A autenticação abre em uma nova guia ou janela nativa; depois do callback validado, a página original exibe o estado de sucesso. Se o navegador bloquear a abertura, o fluxo continua na mesma guia. O FakeGov aceita somente credenciais fictícias; não use credenciais reais. Com o provedor oficial, a página demo não é criada.

O backend é stateless, pode usar múltiplos workers sem armazenamento compartilhado e exige a mesma secret GOVBR_TRANSACTION_SECRET em todas as instâncias. Execute, por exemplo:

uvicorn myapp:app --workers 4

Usar o provedor oficial

O valor padrão é GOVBR_PROVIDER=official. Configure endpoints, credenciais, GOVBR_REDIRECT_URI e GOVBR_TRANSACTION_SECRET conforme Configuração. O mesmo código de aplicação permanece válido.

O backend usa state cifrado com Fernet, PKCE e nonce. O state não é um registro de uso único; a proteção contra replay depende do authorization code de uso único invalidado pelo provedor.

Customizar usuários do FakeGov

Defina GOVBR_FAKE_USERS_FILE com um JSON contendo users. O arquivo deve ficar fora do Git e conter apenas dados fictícios. Veja FakeGov local para repositórios próprios.