DOCS

Autenticazione OAuth 2.0

Autenticazione OAuth 2.0

Autentica i tuoi servizi backend con Zonos utilizzando la crittografia a chiave asimmetrica, senza segreti condivisi.

Zonos supporta l'autenticazione da macchina a macchina tramite Concessione token bearer JWT OAuth 2.0 (RFC7523). Il tuo servizio firma un JWT di breve durata con la tua chiave privata RSA; Zonos lo verifica utilizzando la chiave pubblica registrata e restituisce un token Bearer con ambito della tua organizzazione.

Riepilogo del flusso:

  1. Genera una coppia di chiavi RSA e registra la tua chiave pubblica con Zonos.
  2. In fase di esecuzione, firma un'asserzione JWT con la tua chiave privata e POSTala sull'endpoint del token.
  3. Zonos restituisce un token di accesso di breve durata.
  4. Includere il token di accesso come Authorization: Bearer <token> su ogni richiesta API.

Genera una coppia di chiavi RSA a 4096 bit e condividi la chiave pubblica con Zonos. Questa operazione viene eseguita una volta durante l'onboarding.

Genera la coppia di chiavi 

Condividere public_key.pem con Zonos. Negozio private_key.pem in un gestore di segreti dedicato (AWS Secrets Manager, HashiCorp Vault, ecc.) — mai nel controllo del codice sorgente o nelle variabili di ambiente.

Zonos registrerà la tua chiave e restituirà il tuo ID organizzazione, che diventa il iss rivendicazione in tutte le asserzioni del JWT.

Firma un JWT con RS256 using your private key. The assertion is valid for a single token exchange — keep the expiry window short (60–300 seconds).

Required claims 

ReclamoValore
issIl tuo ID organizzazione Zonos (ad es. "org_abc123")
subIdentifica il servizio chiamante (es. "checkout-service")
audDeve essere esattamente "zonos-auth"
exptimestamp Unix; 60–300 secondi da iat
iatTimestamp Unix di emissione
jtiUUID univoco per asserzione (abilita il rilevamento della riproduzione)

The JWT header must specify "alg": "RS256" E "typ": "JWT".

Esempi di codice 

1import jwt, uuid, time
2 
3with open("private_key.pem") as f:
4 private_key = f.read()
5 
6now = int(time.time())
7assertion = jwt.encode(
8 {
9 "iss": "org_abc123",
10 "sub": "checkout-service",
11 "aud": "zonos-auth",
12 "iat": now,
13 "exp": now + 300,
14 "jti": str(uuid.uuid4()),
15 },
16 private_key,
17 algorithm="RS256",
18)

Invia il JWT firmato all'endpoint del token Zonos per ricevere un token Bearer di breve durata.

Punto finale 

POST https://auth.zonos.com/oauth/token
Content-Type: application/json

application/x-www-form-urlencoded is also accepted.

Request fields 

CampoNecessarioValore
grant_type"urn:ietf:params:oauth:grant-type:jwt-bearer"
assertionIl tuo JWT firmato (serializzazione compatta)

Request and response 

1{
2 "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
3 "assertion": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
4}
Campo di rispostaDescrizione
access_tokenToken al portatore per tutte le successive richieste API
token_typeSempre "Bearer"
expires_inSecondi alla scadenza (default: 300)
scopeAutorizzazioni separate da spazi concesse a questo token

Full code examples 

1import requests
2 
3response = requests.post(
4 "https://auth.zonos.com/oauth/token",
5 json={
6 "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
7 "assertion": assertion,
8 },
9)
10data = response.json()
11access_token = data["access_token"]
12expires_in = data["expires_in"]

Includere il token di accesso come a Bearer gettone nel Authorization intestazione su ogni richiesta Zonos API.

Richiesta di esempio 

1curl -X POST https://api.zonos.com/graphql \
2 -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
3 -H "Content-Type: application/json" \
4 -d '{ "query": "{ ... }" }'

Ciclo di vita e memorizzazione nella cache dei token 

Per impostazione predefinita, i token di accesso scadono dopo 5 minuti. Memorizza il token nella cache e aggiornalo in modo proattivo: non richiedere un nuovo token a ogni chiamata API. Ogni aggiornamento richiede un'asserzione JWT appena firmata.

1import time, requests
2 
3_cache = {"access_token": None, "expires_at": 0}
4 
5def get_access_token():
6 if time.time() < _cache["expires_at"] - 30:
7 return _cache["access_token"]
8 
9 assertion = build_jwt_assertion()
10 data = requests.post(
11 "https://auth.zonos.com/oauth/token",
12 json={
13 "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
14 "assertion": assertion,
15 },
16 ).json()
17 
18 _cache["access_token"] = data["access_token"]
19 _cache["expires_at"] = time.time() + data["expires_in"]
20 return _cache["access_token"]

Riferimento all'errore 

Tutti gli errori seguono il formato di risposta agli errori OAuth 2.0 (RFC 6749 §5.2):

1{
2 "error": "invalid_grant",
3 "error_description": "JWT assertion has expired"
4}
Stato HTTPerrorCausa
400unsupported_grant_typegrant_type non lo era urn:ietf:params:oauth:grant-type:jwt-bearer
400invalid_requestCampo mancante o non valido
401invalid_grantFirma non valida, asserzione scaduta, organizzazione sconosciuta o chiave non registrata
500server_errorErrore interno: contattare l'assistenza Zonos se persistente

Common invalid_grant cause:

  • exp è nel passato: assicurati che l'orologio di sistema sia sincronizzato con NTP
  • aud non è esattamente "zonos-auth"
  • iss non corrisponde all'ID dell'organizzazione registrata
  • La chiave pubblica è stata ruotata ma non ancora aggiornata con Zonos

Migliori pratiche di sicurezza 

  • Proteggi la tua chiave privata. Archiviala in un gestore dei segreti dedicato, mai nel controllo del codice sorgente, nelle variabili di ambiente o nei log.
  • Mantieni le affermazioni di breve durata. 60–300 secondi è lo standard; non c'è motivo di emetterne di più lunghi.
  • Includi jti. Un valore univoco per asserzione consente il rilevamento della riproduzione lato server.
  • Ruota periodicamente le coppie di chiavi. Registra una nuova chiave pubblica con Zonos prima di revocare quella vecchia per evitare tempi di inattività.
  • Non accedere mai access_token O assertion valori. Tratta entrambi come credenziali.

Questa pagina è stata utile?