Construiește un client pentru asistent

Autentificare cu OAuth

Cum se autentifică un asistent fără cheie API: descoperire, înregistrare, consimțământ și tokenuri, pentru când îți construiești propriul client.

Un asistent AI se autentifică la Setherion cu OAuth în loc de o cheie API: persoana apasă Allow pe o pagină Setherion, iar asistentul primește un token. Pagina aceasta este contractul pentru când îți construiești propriul client. Dacă vrei doar să conectezi Claude, ChatGPT, Cursor sau VS Code, urmează MCP: conectează un asistent AI.

Fluxul este OAuth 2.1, așa cum îl cere specificația de autorizare MCP (2025-06-18):

  • fluxul cu cod de autorizare, cu PKCE (S256) cerut mereu;
  • doar clienți publici, fără secret de client;
  • înregistrare dinamică a clientului (RFC 7591), așa că nimeni nu lipește un id de client nicăieri;
  • tokenuri legate de o singură resursă, endpointul MCP (RFC 8707).

Tokenurile funcționează pe serverul MCP și nicăieri altundeva. Endpointurile REST din această referință folosesc o cheie API.

ElementValoare
Issuerhttps://www.setherion.com
Resourcehttps://www.setherion.com/api/mcp
Scopemcp
Token de accesÎncepe cu sto_, ține 1 oră
Token de reîmprospătareÎncepe cu str_, ține 30 de zile, se înlocuiește de fiecare dată când este folosit
Cod de autorizareÎncepe cu stc_, ține 10 minute, merge o singură dată

1. Descoperă

Trimite o cerere către endpointul MCP fără nicio credențială. Răspunsul 401 indică metadatele resursei (RFC 9728) în antetul WWW-Authenticate:

bash
curl https://www.setherion.com/.well-known/oauth-protected-resource/api/mcp
json
{
  "resource": "https://www.setherion.com/api/mcp",
  "authorization_servers": ["https://www.setherion.com"],
  "bearer_methods_supported": ["header"],
  "scopes_supported": ["mcp"],
  "resource_name": "Setherion"
}

Același document se află la /.well-known/oauth-protected-resource. Apoi citește metadatele serverului de autorizare (RFC 8414):

bash
curl https://www.setherion.com/.well-known/oauth-authorization-server
json
{
  "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"]
}

Ambele documente, înregistrarea și endpointul de tokenuri răspund oricărei origini (Access-Control-Allow-Origin: *), așa că un client dintr-o pagină de browser le poate apela.

2. Înregistrează

POSThttps://www.setherion.com/api/oauth/register

Plan: Orice plan

Înregistrează-te o dată pentru fiecare instalare. Înregistrarea nu dă nimic prin ea însăși: o persoană tot trebuie să apese Allow, iar codul este trimis înapoi doar la adresele exacte înregistrate aici.

bash
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"] }'
CâmpCe înseamnă
redirect_urisObligatoriu. Între 1 și 10 adrese, fiecare de cel mult 2.000 de caractere. Duplicatele sunt eliminate.
client_nameOpțional. Se arată persoanei pe pagina de consimțământ. Tăiat la 100 de caractere; An AI assistant când lipsește.
grant_typesOpțional. Se acceptă doar authorization_code și refresh_token.
response_typesOpțional. Doar code.

O adresă de redirecționare trebuie să fie https, sau http înapoi spre această mașină (localhost, 127.0.0.1 sau [::1]). Nu poate avea fragment sau nume de utilizator. Singura adresă care nu este https sau http este cursor://anysphere.cursor-mcp/oauth/callback, pentru aplicațiile Cursor mai vechi.

Oricare ar fi metoda de autentificare pe care o cere un client, el este înregistrat ca client public fără secret, iar răspunsul spune asta:

json
{
  "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"
}

Statusul este 201. Înregistrările sunt limitate la 20 pe oră pentru fiecare adresă de rețea.

Erori la înregistrare

Fiecare eroare este { "error": "...", "error_description": "..." }.

Statuserrorerror_description
400invalid_redirect_uriSend between one and ten redirect_uris.
400invalid_redirect_uriRedirect URIs must be HTTPS, or HTTP back to localhost.
400invalid_client_metadataOnly authorization_code and refresh_token are supported.
400invalid_client_metadataOnly the code response type is supported.
429slow_downToo many registrations. Try again later.
503temporarily_unavailableNot configured. sau Connecting assistants is not switched on yet.

3. Cere acordul persoanei

Deschide endpointul de autorizare în browserul persoanei. Este o pagină, nu un API: persoana se autentifică la Setherion dacă nu este deja autentificată, vede numele pe care l-ai înregistrat și unde va fi trimisă înapoi și apasă Allow sau Cancel.

text
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
ParametruCe înseamnă
response_typeObligatoriu. code.
client_idObligatoriu. Cel de la înregistrare.
redirect_uriUna dintre adresele înregistrate, potrivită exact. Poate lipsi doar dacă ai înregistrat exact una.
code_challengeObligatoriu. Hash-ul S256 al verifier-ului tău, în base64url, de 43 până la 128 de caractere.
code_challenge_methodObligatoriu. S256. plain nu se acceptă.
stateRecomandat. Se trimite înapoi neschimbat. Până la 1.000 de caractere.
resourceOpțional. Dacă îl trimiți, trebuie să fie https://www.setherion.com/api/mcp (o bară oblică de la sfârșit și literele mari sau mici din schemă și din gazdă nu contează).

Fă verifier-ul din 43 până la 128 de caractere din A-Z a-z 0-9 - . _ ~ și păstrează-l până la pasul 4.

Persoana este trimisă înapoi la redirect_uri al tău cu:

  • la Allow: code, state și iss (issuer-ul);
  • la Cancel: error=access_denied, error_description=The request was declined., state și iss;
  • la o problemă cu cererea, după ce clientul și adresa sunt cunoscute ca autentice: error, error_description, state și iss. error este unsupported_response_type, invalid_request (lipsește PKCE sau metoda nu este S256) sau invalid_target (resursa nu este endpointul MCP).

Dacă clientul este necunoscut sau adresa nu este una dintre cele înregistrate, pagina îi spune asta persoanei și nu trimite pe nimeni nicăieri, așa că pagina aceasta nu poate fi folosită niciodată ca să redirecționeze pe cineva către o adresă pe care nu ai înregistrat-o.

4. Schimbă codul

POSThttps://www.setherion.com/api/oauth/token

Plan: Orice plan

Trimite câmpuri codate ca formular, așa cum specifică OAuth. Se acceptă și JSON cu aceleași nume.

bash
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
CâmpCe înseamnă
grant_typeauthorization_code.
codeCodul din redirecționare.
client_idClientul căruia i s-a dat codul.
redirect_uriAceeași adresă ca la pasul 3.
code_verifierVerifier-ul al cărui hash S256 l-ai trimis ca code_challenge.
resourceOpțional. Dacă îl trimiți, trebuie să se potrivească cu resursa codului.
json
{
  "access_token": "sto_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "str_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "scope": "mcp"
}

Trimite tokenul de acces către serverul MCP ca Authorization: Bearer sto_.... Tokenurile nu sunt păstrate niciodată în cache: răspunsul poartă Cache-Control: no-store.

5. Reîmprospătează

Un token de acces ține o oră. Înainte să se termine, sau când serverul MCP răspunde 401, schimbă tokenul de reîmprospătare:

bash
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-6f1c2a9d4e30

Răspunsul este la fel ca la pasul 4, cu un token de reîmprospătare nou. Cel vechi încetează să mai funcționeze, așa că păstrează-l pe cel nou de fiecare dată.

Un token de reîmprospătare folosit a doua oară încheie conexiunea

Folosirea unui token de reîmprospătare a doua oară este citită ca o copie furată, iar Setherion încheie toată conexiunea: toate tokenurile din acel consimțământ încetează să mai funcționeze, iar persoana trebuie să apese Allow din nou. Singura excepție este același client care prezintă același token în 60 de secunde, cât conexiunea este încă deschisă, și așa pot două procese ale aceluiași asistent, de exemplu două ferestre, să se reîmprospăteze în același timp. Un cod folosit de două ori își încheie conexiunea la fel.

Erori

Fiecare eroare de la endpointul de tokenuri are statusul 400, în afară de server_error, și corpul { "error": "...", "error_description": "..." }.

Erori la tokenuri
errorerror_description
unsupported_grant_typeUse authorization_code or refresh_token.
invalid_grantUnknown code.
invalid_grantThis code was already used.
invalid_grantThis code has expired.
invalid_grantThis code was issued to another application.
invalid_grantredirect_uri does not match the one the code was issued for.
invalid_grantPKCE verification failed.
invalid_grantUnknown refresh token.
invalid_grantThis refresh token has expired.
invalid_grantThis token was issued to another application.
invalid_grantThis refresh token was already used. The connection has been ended for safety.
invalid_targetThis code was issued for another resource. sau This token was issued for another resource.
server_error (status 500)Not configured. sau Could not issue tokens.

Încheierea unei conexiuni

Persoana poate deconecta un asistent din Settings, apoi AI assistants and MCP. Toate tokenurile conexiunii, de acces și de reîmprospătare, încetează să mai funcționeze la următoarea cerere, nu când se termină ora. Listarea și încheierea conexiunilor se pot face doar dintr-o sesiune Setherion autentificată, așa că nimic din ce ține un asistent nu le poate face.

Cu o cheie API în schimb

Un client care poate trimite doar un antet fix poate sări peste toate acestea și poate trimite o cheie API către serverul MCP. Vezi Autentificare.

Ți-a fost de folos această pagină?

Alătură-te comunității

Întrebări, idei și ce construiesc alții.