Zbuduj klienta asystenta
Logowanie przez OAuth
Jak asystent loguje się bez klucza API: wykrywanie, rejestracja, zgoda i tokeny, dla budowy własnego klienta.
Asystent AI loguje się do Setherion przez OAuth zamiast kluczem API: osoba klika Allow na stronie Setherion, a asystent dostaje token. Ta strona to umowa dla budowy własnego klienta. Jeśli chcesz tylko połączyć Claude, ChatGPT, Cursor lub VS Code, skorzystaj z MCP: podłącz asystenta AI.
Przepływ to OAuth 2.1, tak jak wymaga tego specyfikacja autoryzacji MCP (2025-06-18):
- przepływ z kodem autoryzacji, z zawsze wymaganym PKCE (S256);
- tylko klienci publiczni, bez sekretu klienta;
- dynamiczna rejestracja klienta (RFC 7591), więc nikt nigdzie nie wkleja identyfikatora klienta;
- tokeny przypisane do jednego zasobu, punktu końcowego MCP (RFC 8707).
Tokeny działają na serwerze MCP i nigdzie indziej. Punkty końcowe REST tej dokumentacji przyjmują klucz API.
| Element | Wartość |
|---|---|
| Issuer | https://www.setherion.com |
| Resource | https://www.setherion.com/api/mcp |
| Scope | mcp |
| Token dostępu | Zaczyna się od sto_, ważny 1 godzinę |
| Token odświeżania | Zaczyna się od str_, ważny 30 dni, wymieniany przy każdym użyciu |
| Kod autoryzacji | Zaczyna się od stc_, ważny 10 minut, działa raz |
1. Wykrywanie
Wyślij żądanie do punktu końcowego MCP bez żadnych danych uwierzytelniających. Odpowiedź 401 wskazuje metadane zasobu (RFC 9728) w nagłówku WWW-Authenticate:
curl https://www.setherion.com/.well-known/oauth-protected-resource/api/mcp{
"resource": "https://www.setherion.com/api/mcp",
"authorization_servers": ["https://www.setherion.com"],
"bearer_methods_supported": ["header"],
"scopes_supported": ["mcp"],
"resource_name": "Setherion"
}Ten sam dokument jest pod adresem /.well-known/oauth-protected-resource. Potem odczytaj metadane serwera autoryzacji (RFC 8414):
curl https://www.setherion.com/.well-known/oauth-authorization-server{
"issuer": "https://www.setherion.com",
"authorization_endpoint": "https://www.setherion.com/oauth/authorize",
"token_endpoint": "https://www.setherion.com/api/oauth/token",
"registration_endpoint": "https://www.setherion.com/api/oauth/register",
"response_types_supported": ["code"],
"grant_types_supported": ["authorization_code", "refresh_token"],
"code_challenge_methods_supported": ["S256"],
"token_endpoint_auth_methods_supported": ["none"],
"scopes_supported": ["mcp"]
}Oba dokumenty, rejestracja i punkt końcowy tokenów odpowiadają każdemu originowi (Access-Control-Allow-Origin: *), więc klient na stronie w przeglądarce może je wywoływać.
2. Rejestracja
https://www.setherion.com/api/oauth/registerPlan: Każdy plan
Rejestruj raz na instalację. Sama rejestracja niczego nie przyznaje: osoba nadal musi kliknąć Allow, a kod jest odsyłany tylko na dokładnie te adresy, które tu zarejestrowano.
curl -X POST https://www.setherion.com/api/oauth/register \
-H "Content-Type: application/json" \
-d '{ "client_name": "My assistant", "redirect_uris": ["http://localhost:8787/callback"] }'| Pole | Znaczenie |
|---|---|
redirect_uris | Wymagane. Od 1 do 10 adresów, każdy najwyżej 2 000 znaków. Duplikaty są odrzucane. |
client_name | Opcjonalne. Pokazywane osobie na stronie zgody. Ucinane do 100 znaków; An AI assistant, gdy pominięte. |
grant_types | Opcjonalne. Przyjmowane są tylko authorization_code i refresh_token. |
response_types | Opcjonalne. Tylko code. |
Adres przekierowania musi być https albo http z powrotem do tego komputera (localhost, 127.0.0.1 lub [::1]). Nie może mieć fragmentu ani nazwy użytkownika. Jedyny adres, który nie jest https ani http, to cursor://anysphere.cursor-mcp/oauth/callback, dla starszych aplikacji Cursor.
Niezależnie od metody uwierzytelniania, o którą prosi klient, jest on rejestrowany jako klient publiczny bez sekretu, a odpowiedź to mówi:
{
"client_id": "5f0c2a9d-4e30-4d7f-b8a5-6f1c2a9d4e30",
"client_id_issued_at": 1790000000,
"client_name": "My assistant",
"redirect_uris": ["http://localhost:8787/callback"],
"grant_types": ["authorization_code", "refresh_token"],
"response_types": ["code"],
"token_endpoint_auth_method": "none"
}Status to 201. Rejestracje są ograniczone do 20 na godzinę z jednego adresu sieciowego.
Błędy rejestracji
Każdy błąd ma postać { "error": "...", "error_description": "..." }.
| Status | error | error_description |
|---|---|---|
400 | invalid_redirect_uri | Send between one and ten redirect_uris. |
400 | invalid_redirect_uri | Redirect URIs must be HTTPS, or HTTP back to localhost. |
400 | invalid_client_metadata | Only authorization_code and refresh_token are supported. |
400 | invalid_client_metadata | Only the code response type is supported. |
429 | slow_down | Too many registrations. Try again later. |
503 | temporarily_unavailable | Not configured. lub Connecting assistants is not switched on yet. |
3. Zapytaj osobę
Otwórz punkt końcowy autoryzacji w przeglądarce osoby. To strona, a nie API: osoba loguje się do Setherion, jeśli jeszcze tego nie zrobiła, widzi zarejestrowaną przez ciebie nazwę i miejsce, do którego zostanie odesłana, i klika Allow albo Cancel.
https://www.setherion.com/oauth/authorize
?response_type=code
&client_id=5f0c2a9d-4e30-4d7f-b8a5-6f1c2a9d4e30
&redirect_uri=http%3A%2F%2Flocalhost%3A8787%2Fcallback
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
&code_challenge_method=S256
&state=af0ifjsldkj
&resource=https%3A%2F%2Fwww.setherion.com%2Fapi%2Fmcp| Parametr | Znaczenie |
|---|---|
response_type | Wymagany. code. |
client_id | Wymagany. Z rejestracji. |
redirect_uri | Jeden z zarejestrowanych adresów, dopasowywany dokładnie. Można go pominąć tylko wtedy, gdy zarejestrowano dokładnie jeden. |
code_challenge | Wymagany. Skrót S256 twojego weryfikatora, w base64url, od 43 do 128 znaków. |
code_challenge_method | Wymagany. S256. Wartość plain nie jest przyjmowana. |
state | Zalecany. Odsyłany bez zmian. Do 1 000 znaków. |
resource | Opcjonalny. Jeśli jest wysłany, musi być https://www.setherion.com/api/mcp (końcowy ukośnik oraz wielkość liter schematu i hosta nie mają znaczenia). |
Zrób weryfikator z 43 do 128 znaków spośród A-Z a-z 0-9 - . _ ~ i zachowaj go do kroku 4.
Osoba jest odsyłana do twojego redirect_uri z:
- po Allow:
code,stateiiss(issuer); - po Cancel:
error=access_denied,error_description=The request was declined.,stateiiss; - przy problemie z żądaniem, gdy klient i adres są już uznane za prawdziwe:
error,error_description,stateiiss. Wartośćerrortounsupported_response_type,invalid_request(brak PKCE albo metoda nie jestS256) lubinvalid_target(zasób nie jest punktem końcowym MCP).
Jeśli klient jest nieznany albo adres nie jest jednym z zarejestrowanych, strona mówi o tym osobie i nikogo nigdzie nie wysyła, więc tej strony nigdy nie można użyć do przekierowania kogoś na adres, którego nie zarejestrowano.
4. Wymień kod
https://www.setherion.com/api/oauth/tokenPlan: Każdy plan
Wyślij pola zakodowane jako formularz, tak jak określa OAuth. JSON z tymi samymi nazwami też jest przyjmowany.
curl -X POST https://www.setherion.com/api/oauth/token \
-d grant_type=authorization_code \
-d code=stc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
-d client_id=5f0c2a9d-4e30-4d7f-b8a5-6f1c2a9d4e30 \
-d redirect_uri=http://localhost:8787/callback \
-d code_verifier=YOUR_VERIFIER| Pole | Znaczenie |
|---|---|
grant_type | authorization_code. |
code | Kod z przekierowania. |
client_id | Klient, któremu wydano kod. |
redirect_uri | Ten sam adres co w kroku 3. |
code_verifier | Weryfikator, którego skrót S256 wysłano jako code_challenge. |
resource | Opcjonalne. Jeśli jest wysłane, musi pasować do zasobu kodu. |
{
"access_token": "sto_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "str_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"scope": "mcp"
}Wyślij token dostępu do serwera MCP jako Authorization: Bearer sto_.... Tokeny nigdy nie są buforowane: odpowiedź ma nagłówek Cache-Control: no-store.
5. Odświeżanie
Token dostępu działa godzinę. Zanim wygaśnie, albo gdy serwer MCP odpowie 401, wymień token odświeżania:
curl -X POST https://www.setherion.com/api/oauth/token \
-d grant_type=refresh_token \
-d refresh_token=str_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
-d client_id=5f0c2a9d-4e30-4d7f-b8a5-6f1c2a9d4e30Odpowiedź jest taka sama jak w kroku 4, z nowym tokenem odświeżania. Stary przestaje działać, więc za każdym razem zapisuj nowy.
Ponowne użycie tokenu odświeżania kończy połączenie
Użycie tokenu odświeżania po raz drugi jest odczytywane jako skradziona kopia i Setherion kończy całe połączenie: każdy token z tej zgody przestaje działać, a osoba musi kliknąć Allow ponownie. Jedyny wyjątek to ten sam klient przedstawiający ten sam token w ciągu 60 sekund, gdy połączenie jest jeszcze otwarte, i właśnie tak dwa procesy jednego asystenta, na przykład dwa okna, mogą odświeżać jednocześnie. Kod użyty dwa razy kończy swoje połączenie w ten sam sposób.
Błędy
Każdy błąd z punktu końcowego tokenów ma status 400, poza server_error, oraz treść { "error": "...", "error_description": "..." }.
Błędy tokenów
error | error_description |
|---|---|
unsupported_grant_type | Use authorization_code or refresh_token. |
invalid_grant | Unknown code. |
invalid_grant | This code was already used. |
invalid_grant | This code has expired. |
invalid_grant | This code was issued to another application. |
invalid_grant | redirect_uri does not match the one the code was issued for. |
invalid_grant | PKCE verification failed. |
invalid_grant | Unknown refresh token. |
invalid_grant | This refresh token has expired. |
invalid_grant | This token was issued to another application. |
invalid_grant | This refresh token was already used. The connection has been ended for safety. |
invalid_target | This code was issued for another resource. lub This token was issued for another resource. |
server_error (status 500) | Not configured. lub Could not issue tokens. |
Kończenie połączenia
Osoba może odłączyć asystenta w zakładce Settings, potem AI assistants and MCP. Każdy token tego połączenia, dostępu i odświeżania, przestaje działać przy następnym żądaniu, a nie dopiero gdy minie godzina. Wyświetlanie i kończenie połączeń jest możliwe tylko z zalogowanej sesji Setherion, więc nic, co trzyma asystent, nie może tego zrobić.
Zamiast tego klucz API
Klient, który potrafi wysłać tylko stały nagłówek, może pominąć to wszystko i wysłać klucz API do serwera MCP. Zobacz Uwierzytelnianie.
Czy ta strona była pomocna?
