A criação desta biblioteca nasceu de uma necessidade real: ao tentar integrar com o Login Único Gov.br, enfrentei diversas dificuldades iniciais — desde entender o fluxo de autenticação com PKCE, até decidir qual abordagem seria mais segura: fazer tudo no frontend ou delegar ao backend?
Veja também: 🔒 Boas práticas adotadas
Instalação mínima (somente núcleo de serviços):
pip install govbr-auth
Instalação com framework específico:
pip install govbr-auth[fastapi]
# ou
pip install govbr-auth[flask]
# ou
pip install govbr-auth[django]
Instalação completa (todos os frameworks):
pip install govbr-auth[full]
Via .env
:
GOVBR_REDIRECT_URI=
GOVBR_CLIENT_ID=
GOVBR_CLIENT_SECRET=
GOVBR_CODE_CHALLENGE_METHOD=S256
GOVBR_SCOPE=openid email profile
GOVBR_RESPONSE_TYPE=code
CRIPT_VERIFIER_SECRET=
GOVBR_AUTH_URL=https://sso.staging.acesso.gov.br/authorize
GOVBR_TOKEN_URL=https://sso.staging.acesso.gov.br/token
GOVBR_USER_INFO=https://api.acesso.gov.br/userinfo
JWT_SECRET=chave_super_secreta
JWT_EXPIRES_MINUTES=60
JWT_ALGORITHM=HS256
Ou via código:
from govbr_auth.core.config import GovBrConfig
config = GovBrConfig(
client_id="...",
client_secret="...",
redirect_uri="https://...",
cript_verifier_secret="...",
)
Certifique-se de gerar um valor único e seguro para o cript_verifier_secret
.
Esse valor deve ser mantido em segredo e não deve ser compartilhado publicamente, pois é usado para proteger a troca de tokens entre o cliente e o servidor de autenticação.
Você pode usar a função generate_cript_verifier_secret
para isso.
from govbr_auth.utils import generate_cript_verifier_secret
print(generate_cript_verifier_secret())
# gera um valor válido para o `cript_verifier_secret`, exemplo: Vvd9H5VC2Aqk-dwFOJX6MvQTuZZARmb37y7un9wkj0c=
from fastapi import FastAPI
from govbr_auth.controller import GovBrConnector
def after_auth(data, request):
user = data["id_token_decoded"]
return {
"mensagem": "Login efetuado com sucesso!",
"usuario": user["name"],
"cpf": user["sub"]
}
app = FastAPI()
connector = GovBrConnector(config,
prefix="/auth",
authorize_endpoint="/govbr/authorize",
authenticate_endpoint="/govbr/callback",
on_auth_success=after_auth
)
connector.init_fastapi(app)
from flask import Flask, jsonify, request
from govbr_auth import GovBrConnector, GovBrConfig
def after_auth(data, request):
user = data["id_token_decoded"]
return jsonify({
"mensagem": "Login efetuado com sucesso!",
"usuario": user["name"],
"cpf": user["sub"]
})
config = GovBrConfig.from_env()
connector = GovBrConnector(config,
prefix="/auth",
authorize_endpoint="/govbr/authorize",
authenticate_endpoint="/govbr/callback",
on_auth_success=after_auth
)
app = Flask(__name__)
connector.init_flask(app)
from django.http import JsonResponse
from govbr_auth import GovBrConnector, GovBrConfig
def after_auth(data, request):
user = data["id_token_decoded"]
return JsonResponse({
"mensagem": "Usuário autenticado!",
"nome": user.get("name"),
"cpf": user.get("sub")
})
config = GovBrConfig.from_env()
connector = GovBrConnector(config,
prefix="/auth",
authorize_endpoint="/govbr/authorize",
authenticate_endpoint="/govbr/callback",
on_auth_success=after_auth
)
urlpatterns = [
*connector.init_django(),
]
Você pode usar os serviços principais diretamente, de forma assíncrona ou síncrona:
from govbr_auth.core.govbr import GovBrAuthorize, GovBrIntegration
authorize = GovBrAuthorize(config)
auth_url = authorize.build_authorize_url()
integration = GovBrIntegration(config)
result = await integration.async_exchange_code_for_token(code, state)
from govbr_auth.core.govbr import GovBrAuthorize, GovBrIntegration
authorize = GovBrAuthorize(config)
auth_url = authorize.build_authorize_url_sync()
integration = GovBrIntegration(config)
result = integration.exchange_code_for_token_sync(code, state)
Ideal para:
- APIs customizadas
- Serviços Lambda/FaaS
- Apps que não usam frameworks web tradicionais
GET /auth/govbr/authorize
→ Retorna a URL de autorização Gov.br com PKCEGET /auth/govbr/authenticate
→ Recebecode
estate
, troca por tokens e retorna dados decodificados
Os caminhos podem ser personalizados via
GovBrConfig
pytest tests/
MIT