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.
| Element | Valoare |
|---|---|
| Issuer | https://www.setherion.com |
| Resource | https://www.setherion.com/api/mcp |
| Scope | mcp |
| 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:
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"
}Același document se află la /.well-known/oauth-protected-resource. Apoi citește metadatele serverului de autorizare (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"]
}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ă
https://www.setherion.com/api/oauth/registerPlan: 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.
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âmp | Ce înseamnă |
|---|---|
redirect_uris | Obligatoriu. Între 1 și 10 adrese, fiecare de cel mult 2.000 de caractere. Duplicatele sunt eliminate. |
client_name | Opțional. Se arată persoanei pe pagina de consimțământ. Tăiat la 100 de caractere; An AI assistant când lipsește. |
grant_types | Opțional. Se acceptă doar authorization_code și refresh_token. |
response_types | Opț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:
{
"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": "..." }.
| 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. 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.
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| Parametru | Ce înseamnă |
|---|---|
response_type | Obligatoriu. code. |
client_id | Obligatoriu. Cel de la înregistrare. |
redirect_uri | Una dintre adresele înregistrate, potrivită exact. Poate lipsi doar dacă ai înregistrat exact una. |
code_challenge | Obligatoriu. Hash-ul S256 al verifier-ului tău, în base64url, de 43 până la 128 de caractere. |
code_challenge_method | Obligatoriu. S256. plain nu se acceptă. |
state | Recomandat. Se trimite înapoi neschimbat. Până la 1.000 de caractere. |
resource | Opț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șiiss(issuer-ul); - la Cancel:
error=access_denied,error_description=The request was declined.,stateșiiss; - la o problemă cu cererea, după ce clientul și adresa sunt cunoscute ca autentice:
error,error_description,stateșiiss.erroresteunsupported_response_type,invalid_request(lipsește PKCE sau metoda nu esteS256) sauinvalid_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
https://www.setherion.com/api/oauth/tokenPlan: Orice plan
Trimite câmpuri codate ca formular, așa cum specifică OAuth. Se acceptă și JSON cu aceleași nume.
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âmp | Ce înseamnă |
|---|---|
grant_type | authorization_code. |
code | Codul din redirecționare. |
client_id | Clientul căruia i s-a dat codul. |
redirect_uri | Aceeași adresă ca la pasul 3. |
code_verifier | Verifier-ul al cărui hash S256 l-ai trimis ca code_challenge. |
resource | Opțional. Dacă îl trimiți, trebuie să se potrivească cu resursa codului. |
{
"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:
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-6f1c2a9d4e30Ră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
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. 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ă?
