Passa al contenuto principale

OAuth e Original Connect

Original funziona come authorization server OAuth 2.0 / OpenID Connect. App esterne e piattaforme di agenti (ad esempio i client MCP) possono far accedere gli utenti con il loro account Original e agire per loro conto, tramite l'SDK Original Connect o un qualsiasi client OAuth standard.

Standard supportati​

StandardCosa copre
RFC 6749Framework OAuth 2.0 (grant authorization code e refresh token)
RFC 7636PKCE, obbligatorio per tutti i client, solo S256
RFC 7591Dynamic Client Registration: le app si registrano da sole, senza un admin
RFC 8414Authorization Server Metadata (/.well-known/oauth-authorization-server)
OpenID ConnectID token (RS256), discovery (/.well-known/openid-configuration), UserInfo
RFC 7009Revoca dei token

Endpoint​

Tutti gli endpoint sono relativi a https://ai.original.land.

EndpointScopo
GET /.well-known/oauth-authorization-serverMetadati del server (usati dai client MCP)
GET /.well-known/openid-configurationStessi metadati, percorso OpenID Connect
POST /oauth/registerRegistrazione dinamica del client
GET /oauth/authorizeAccesso e consenso dell'utente
POST /oauth/tokenScambio di un code o di un refresh token con i token
POST /oauth/revokeRevoca di un refresh token
GET /oauth/userinfoProfilo dell'utente autenticato
GET /oauth/jwksChiavi pubbliche per verificare ID token e access token
suggerimento

Parti dal documento di discovery. La maggior parte delle librerie OAuth ha bisogno solo dell'URL dell'issuer e configura il resto in automatico.

Registrare un client (RFC 7591)​

Invia un body JSON a POST /oauth/register:

{
"client_name": "My App",
"redirect_uris": ["https://myapp.example.com/callback"],
"token_endpoint_auth_method": "none",
"grant_types": ["authorization_code", "refresh_token"],
"scope": "openid profile agent.chat:<agentId>"
}
CampoNote
client_nameObbligatorio, massimo 200 caratteri
redirect_urisObbligatorio, da 1 a 20 URL. I redirect devono corrispondere esattamente
token_endpoint_auth_methodnone (client pubblico, default) o client_secret_post (client confidenziale)
grant_typesIncludi refresh_token per ricevere refresh token come client pubblico
scopeSeparati da spazio. Gli scope non consentiti ai client dinamici vengono scartati
client_uri, logo_uri, contactsMetadati opzionali

La risposta (201) contiene un client_id (prefisso oc_). I client confidenziali ricevono anche un client_secret (prefisso ocs_) che non scade.

warning

Il client_secret viene mostrato una sola volta nella risposta di registrazione. Conservalo in modo sicuro.

Le registrazioni hanno un limite di frequenza: una risposta 429 too_many_requests indica di riprovare più tardi.

Scope​

ScopeSignificatoClient dinamici
openidEmette un ID token e abilita UserInfoSì
profileEmail, nome, immagine, piano e creditiSì
agent.chat:<agentId>Chattare con un agente specifico per conto dell'utenteSì
agent.purchaseAcquistare piani o riscattare voucher per gli agentiSì
workspaceAccesso privilegiato al workspaceNo, richiede la registrazione manuale da parte del team Original

Se non viene richiesto alcuno scope, il client riceve openid profile.

Flusso di autorizzazione​

  1. Reindirizza l'utente a /oauth/authorize con response_type=code, client_id, redirect_uri, scope, state, nonce opzionale, code_challenge e code_challenge_method=S256.
  2. L'utente accede, sceglie l'account e approva la schermata di consenso.
  3. Original reindirizza a redirect_uri con code e state, oppure con error=access_denied se l'utente rifiuta.
  4. Chiama POST /oauth/token (form-encoded) con grant_type=authorization_code, code, redirect_uri, client_id, code_verifier e client_secret per i client confidenziali.

Durata dei token​

TokenDurata
Authorization code60 secondi, uso singolo
Access token1 ora
Refresh token (client confidenziale)30 giorni
Refresh token (client pubblico)7 giorni

I refresh token ruotano: ogni chiamata con grant_type=refresh_token restituisce un nuovo refresh token e invalida il precedente. I client pubblici ricevono refresh token solo se si sono registrati con il grant type refresh_token.

UserInfo​

GET /oauth/userinfo con Authorization: Bearer <access_token> richiede lo scope openid. Con profile restituisce anche email, name, picture, il plan e i credits della piattaforma, gli agenti sbloccati e gli abbonamenti attivi agli agenti.