# Uwierz Bogu auth.md

> Webinary, artykuły i odpowiedzi biblijne są publiczne: REST API i serwer MCP działają bez rejestracji i bez tokenu. Logowanie (OAuth 2.1) jest potrzebne tylko do zapisów konkretnego czytelnika na webinary.

## Dla kogo

Agenci AI i klienci MCP działający w imieniu czytelnika uwierzbogu.pl, który chce, żeby agent sprawdzał, na które webinary jest zapisany, zapisywał go na nadchodzące webinary albo wypisywał. Do samych treści nie rejestruj się — wywołuj narzędzia publiczne bez nagłówka Authorization.

## Co wymaga tokenu

Serwer MCP https://uwierzbogu.pl/mcp:

| Narzędzie | Scope | Co robi |
|---|---|---|
| `list_my_webinar_registrations` | `webinars:read` | nadchodzące i minione webinary, na które czytelnik jest zapisany (tytuł, termin, adres, data zapisu) |
| `register_for_webinar` (`slug`) | `webinars:write` | zapis na nadchodzący webinar — tak samo jak formularz na stronie webinaru; przypomnienia przychodzą e-mailem |
| `cancel_webinar_registration` (`slug`) | `webinars:write` | usuwa zapis czytelnika na ten webinar |

Wywołanie tych narzędzi bez tokenu daje HTTP 401 z nagłówkiem `WWW-Authenticate: Bearer resource_metadata="…/.well-known/oauth-protected-resource/mcp", scope="webinars:read webinars:write"`. Token z za wąskim zakresem: HTTP 403, `error="insufficient_scope"`. Zapis na newsletter nie jest wymagany; czytelnik może go zaznaczyć sam na ekranie zgody.

## Odkrywanie

1. Metadane zasobu (RFC 9728): https://uwierzbogu.pl/.well-known/oauth-protected-resource/mcp (zasób https://uwierzbogu.pl/mcp) albo https://uwierzbogu.pl/.well-known/oauth-protected-resource (cały serwis).
2. Metadane serwera autoryzacji (RFC 8414): https://uwierzbogu.pl/.well-known/oauth-authorization-server — issuer https://uwierzbogu.pl, blok `agent_auth`, klucze JWKS https://uwierzbogu.pl/oauth/jwks.json.

## Rejestracja

Dwie metody. Obie kończą się tym samym: token dostępu do https://uwierzbogu.pl/mcp po zalogowaniu czytelnika linkiem z e-maila i jego zgodzie. Nie ma haseł ani kluczy API.

### 1. OAuth 2.1 z dynamiczną rejestracją (klienci MCP)

1. `POST` https://uwierzbogu.pl/oauth/register (RFC 7591, JSON): `redirect_uris` (https albo http na 127.0.0.1, localhost lub [::1] dla aplikacji natywnych; port loopback może się zmieniać), `client_name`, `token_endpoint_auth_method` (`none` dla klientów publicznych albo `client_secret_basic` / `client_secret_post`), `grant_types: ["authorization_code","refresh_token"]`. Odpowiedź 201 z `client_id` (i `client_secret`, jeśli klient poufny — pokazywany tylko raz).
2. Przeglądarka: https://uwierzbogu.pl/oauth/authorize z parametrami `response_type=code`, `client_id`, `redirect_uri`, `scope=webinars:read webinars:write`, `state`, `code_challenge`, `code_challenge_method=S256`, `resource` = https://uwierzbogu.pl/mcp. PKCE S256 jest obowiązkowe, `redirect_uri` musi być dokładnie taki jak przy rejestracji.
3. Czytelnik podaje e-mail, klika link (albo wpisuje 6-cyfrowy kod) i na ekranie zgody widzi nazwę klienta, adres powrotu, zakresy i zasób.
4. Powrót: `redirect_uri?code=…&state=…&iss=…` (sprawdź `state` i `iss`). Kod działa 3 minuty, jeden raz.
5. `POST` https://uwierzbogu.pl/oauth/token (`application/x-www-form-urlencoded`): `grant_type=authorization_code`, `code`, `redirect_uri`, `code_verifier`, `client_id`, `resource`.

### 2. Rejestracja agenta (auth.md, service_auth)

Gdy agent zna tylko e-mail czytelnika i nie ma przeglądarki z przekierowaniem:

1. `POST` https://uwierzbogu.pl/oauth/agent/identity (JSON) `{"type":"service_auth","login_hint":"czytelnik@example.com","client_name":"Nazwa agenta"}`. Przyjmujemy też kształt `{"type":"identity_assertion","assertion_type":"verified_email","assertion":"czytelnik@example.com"}` (adres i tak potwierdza czytelnik linkiem z e-maila). Odpowiedź 200: `registration_id`, `claim_token` (zwracany raz, trzymaj w pamięci), `claim_token_expires` (1 h), `post_claim_scopes`, `claim` = `user_code` (6 cyfr), `verification_uri`, `expires_in` (600), `interval` (5).
2. Pokaż czytelnikowi w jednej wiadomości `verification_uri` i `user_code`. Czytelnik otwiera link, loguje się linkiem z e-maila wysłanym na podany adres, sprawdza, o co prosisz, i wpisuje `user_code` na naszej stronie (nie odsyła go Tobie).
3. Odpytuj `POST` https://uwierzbogu.pl/oauth/token z `grant_type=urn:workos:agent-auth:grant-type:claim` i `claim_token` nie częściej niż co `interval` sekund. Odpowiedzi: `authorization_pending`, `slow_down`, `expired_token` (nowy kod: `POST` https://uwierzbogu.pl/oauth/agent/identity/claim z `{"claim_token":"…","email":"…"}`), `access_denied` (czytelnik odmówił), a po zgodzie standardowa odpowiedź tokenu z `access_token`, `refresh_token`, `scope` i `client_id`.

## Poświadczenia

- `Authorization: Bearer <access_token>` w każdym żądaniu do https://uwierzbogu.pl/mcp. Nigdy w adresie URL.
- Access token: JWT RS256 (`typ: at+jwt`), ważny 3600 s, `aud` = zasób, o który prosiłeś (`resource`). Na innym zasobie nie działa.
- Odświeżanie: `grant_type=refresh_token` z `refresh_token` (+ `client_id` / sekret klienta). Każde użycie daje nowy refresh token; ponowne użycie starego unieważnia cały łańcuch. Refresh token żyje 30 dni od ostatniego użycia, łańcuch najwyżej 90 dni — potem czytelnik loguje się ponownie.
- Na HTTP 401 z `error="invalid_token"` odśwież token raz; jeśli dostaniesz `invalid_grant`, zacznij od rejestracji.

## Odwołanie

- Agent: `POST` https://uwierzbogu.pl/oauth/revoke (RFC 7009) z `token` i `token_type_hint=refresh_token` — odwołanie refresh tokenu kończy cały łańcuch. Zawsze 200.
- Czytelnik: strona „Twoje połączone aplikacje” https://uwierzbogu.pl/oauth/aplikacje (link przychodzi też w e-mailu po każdym nowym połączeniu). Odwołanie działa od razu, także dla wydanych access tokenów.

## Limity

Serwer MCP i REST: 60 zapytań na minutę z jednego IP (429, Retry-After). Rejestracje klientów: 10 na godzinę z IP. E-maile logowania: 3 na 15 minut na adres. Token: 60 zapytań na minutę z IP. Kod z e-maila i `user_code`: 5 prób. Zapisy na webinary: 20 na dobę na czytelnika.

## Dane i prywatność

Przechowujemy adres e-mail czytelnika, nazwę klienta, zakresy i daty zgody. Tokeny, kody i linki tylko jako skróty HMAC. Dziennik bezpieczeństwa bez adresów e-mail i IP w jawnej postaci, 90 dni. Szczegóły: https://uwierzbogu.pl/polityka-prywatnosci (punkt o połączonych aplikacjach). Dokumentacja: https://uwierzbogu.pl/dla-agentow

## English

Content is public: call the MCP server (https://uwierzbogu.pl/mcp) without credentials. Only the reader's own webinar registration tools (`list_my_webinar_registrations`, `register_for_webinar`, `cancel_webinar_registration`; scopes `webinars:read`, `webinars:write`) need an OAuth 2.1 access token from https://uwierzbogu.pl. Either register a client (RFC 7591, https://uwierzbogu.pl/oauth/register) and run the authorization code flow with PKCE S256 and `resource` = https://uwierzbogu.pl/mcp, or register as an agent with `POST` https://uwierzbogu.pl/oauth/agent/identity `{"type":"service_auth","login_hint":"<reader e-mail>"}`, show the reader `verification_uri` + `user_code`, and poll https://uwierzbogu.pl/oauth/token with `grant_type=urn:workos:agent-auth:grant-type:claim`. The reader signs in with an e-mail link (no passwords) and approves on a consent screen. Access tokens last 3600 s; refresh tokens rotate (reuse revokes the chain). Revoke at https://uwierzbogu.pl/oauth/revoke; readers manage access at https://uwierzbogu.pl/oauth/aplikacje.
