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 (RFC 7523). 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:
Genera una coppia di chiavi RSA e registra la tua chiave pubblica con Zonos.
In fase di esecuzione, firma un'asserzione JWT con la tua chiave privata e inviala con una richiesta POST all'endpoint del token.
Zonos restituisce un token di accesso di breve durata.
Includi il token di accesso come Authorization: Bearer <token> su ogni richiesta API.
Passaggio 1: registra la tua chiave pubblica (configurazione una tantum)
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.
Condividi public_key.pem con Zonos. Archivia 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 claim iss in tutte le asserzioni JWT.
Passaggio 2: crea un'asserzione JWT
Firma un JWT con RS256 utilizzando la tua chiave privata. L'asserzione è valida per un solo scambio di token: mantieni breve la finestra di scadenza (60–300 secondi).
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.
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 registrare mai i valori di access_token o assertion nei log. Tratta entrambi come credenziali.
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 (RFC 7523). 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:
Authorization: Bearer <token>su ogni richiesta API.Passaggio 1: registra la tua chiave pubblica (configurazione una tantum)
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
# Generate private keyopenssl genrsa -out private_key.pem 4096# Extract public keyopenssl rsa -in private_key.pem -pubout -out public_key.pemCondividi
public_key.pemcon Zonos. Archiviaprivate_key.pemin 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 claim
issin tutte le asserzioni JWT.Passaggio 2: crea un'asserzione JWT
Firma un JWT con
RS256utilizzando la tua chiave privata. L'asserzione è valida per un solo scambio di token: mantieni breve la finestra di scadenza (60–300 secondi).Claim richiesti
iss"org_abc123")sub"checkout-service")aud"zonos-auth"expiatiatjtiL'intestazione del JWT deve specificare
"alg": "RS256"e"typ": "JWT".Esempi di codice
import jwt, uuid, timewith open("private_key.pem") as f:private_key = f.read()now = int(time.time())assertion = jwt.encode({"iss": "org_abc123","sub": "checkout-service","aud": "zonos-auth","iat": now,"exp": now + 300,"jti": str(uuid.uuid4()),},private_key,algorithm="RS256",)Passaggio 3: scambia l'asserzione con un token di accesso
Invia il JWT firmato all'endpoint del token Zonos per ricevere un token Bearer di breve durata.
Punto finale
È accettato anche
application/x-www-form-urlencoded.Campi della richiesta
grant_type"urn:ietf:params:oauth:grant-type:jwt-bearer"assertionRichiesta e risposta
{"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer","assertion": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."}access_tokentoken_type"Bearer"expires_inscopeEsempi di codice completi
import requestsresponse = requests.post("https://auth.zonos.com/oauth/token",json={"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer","assertion": assertion,},)data = response.json()access_token = data["access_token"]expires_in = data["expires_in"]Passaggio 4: chiama le API Zonos con il token di accesso
Includi il token di accesso come token
Bearernell'intestazioneAuthorizationdi ogni richiesta API Zonos.Richiesta di esempio
curl -X POST https://api.zonos.com/graphql \-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \-H "Content-Type: application/json" \-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.
import time, requests_cache = {"access_token": None, "expires_at": 0}def get_access_token():if time.time() < _cache["expires_at"] - 30:return _cache["access_token"]assertion = build_jwt_assertion()data = requests.post("https://auth.zonos.com/oauth/token",json={"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer","assertion": assertion,},).json()_cache["access_token"] = data["access_token"]_cache["expires_at"] = time.time() + data["expires_in"]return _cache["access_token"]Riferimento all'errore
Tutti gli errori seguono il formato di risposta agli errori OAuth 2.0 (RFC 6749 §5.2):
{"error": "invalid_grant","error_description": "JWT assertion has expired"}error↕400unsupported_grant_typegrant_typenon corrispondeva aurn:ietf:params:oauth:grant-type:jwt-bearer400invalid_request401invalid_grant500server_errorCause comuni di
invalid_grant:expè nel passato: assicurati che l'orologio di sistema sia sincronizzato con NTPaudnon è esattamente"zonos-auth"issnon corrisponde all'ID dell'organizzazione registrataMigliori pratiche di sicurezza
jti. Un valore univoco per asserzione consente il rilevamento della riproduzione lato server.access_tokenoassertionnei log. Tratta entrambi come credenziali.Questa pagina è stata utile?