# auth.md

Você é um agente. Este site publica uma API **pública** de portfólio. Não precisa registrar usuário nem obter token para ler os dados. Siga os passos abaixo se o seu cliente exige descoberta OAuth.

## O que este serviço é

API somente leitura de Lucas Cavalheri: perfil, projetos, experiência, stack e contato. Sem cadastro, sem chave, sem cookie de sessão.

- Recurso: https://lucascavalheri.com.br/api/v1
- Documentação: https://lucascavalheri.com.br/desenvolvedores
- OpenAPI: https://lucascavalheri.com.br/openapi.json
- MCP: https://lucascavalheri.com.br/mcp

## Step 1 — Discover

### 1a. Protected Resource Metadata

    GET https://lucascavalheri.com.br/.well-known/oauth-protected-resource

Campos relevantes: `resource`, `authorization_servers` (o issuer é https://lucascavalheri.com.br), `scopes_supported` (`portfolio:read`), `bearer_methods_supported` (`header`).

### 1b. Authorization Server metadata

    GET https://lucascavalheri.com.br/.well-known/oauth-authorization-server

O bloco `agent_auth` aponta de volta para este arquivo (`skill`), para `register_uri` e para o método `anonymous`.

OIDC equivalente: https://lucascavalheri.com.br/.well-known/openid-configuration

## Step 2 — Pick a method

Use **anonymous**. Não há conta de usuário neste site, então ID-JAG e e-mail verificado não se aplicam. A API aceita GET sem `Authorization`.

## Step 3 — Register (opcional)

    POST https://lucascavalheri.com.br/agent/identity
    Content-Type: application/json

    { "type": "anonymous" }

A resposta confirma que nenhum credencial é emitido. Se o seu runtime insiste em um Bearer, peça um token público:

    POST https://lucascavalheri.com.br/oauth/token
    Content-Type: application/x-www-form-urlencoded

    grant_type=client_credentials&scope=portfolio:read

O token `public` é aceito e ignorado. Não há claim ceremony: `POST https://lucascavalheri.com.br/agent/identity/claim` responde que claim não se aplica.

## Step 4 — Use the API

    GET https://lucascavalheri.com.br/api/v1/index.json

Erro segue RFC 9457 em application/problem+json. Limite: 120 req / 60 s, cabeçalhos RateLimit-* e 429 com Retry-After.

## Revocation

Não há sessão para revogar. `POST https://lucascavalheri.com.br/oauth/revoke` é idempotente e responde 200.
