DOCS

OAuth 2.0-godkjenning

OAuth 2.0-godkjenning

Autentiser dine bakendtjenester med Zonos ved hjelp av asymmetrisk nøkkelkryptografi — ingen delte hemmeligheter.

Zonos støtter maskin-til-maskin-autentisering via OAuth 2.0 JWT Bearer Token Grant (RFC 7523). Tjenesten din signerer en kortvarig JWT med din private RSA-nøkkel; Zonos bekrefter den ved hjelp av din registrerte offentlige nøkkel og returnerer en Bearer-token som er begrenset til organisasjonen din.

Flytsammendrag:

  1. Generer et RSA-nøkkelpar og registrer din offentlige nøkkel med Zonos.
  2. Under kjøring signerer du en JWT-påstand med din private nøkkel og POSTER den til token-endepunktet.
  3. Zonos returnerer en kortvarig tilgangstoken.
  4. Inkluder tilgangstokenen som Authorization: Bearer <token> på hver API-forespørsel.

Generer et 4096-bits RSA-nøkkelpar og del den offentlige nøkkelen med Zonos. Dette gjøres en gang under onboarding.

Generer nøkkelparet 

1# Generate private key
2openssl genrsa -out private_key.pem 4096
3 
4# Extract public key
5openssl rsa - private_key.pem -pubout -out public_key.pem

Del public_key.pem med Zonos. Lagre private_key.pem i en dedikert hemmelighetsbehandler (AWS Secrets Manager, HashiCorp Vault, osv.) — aldri i versjonskontroll eller miljøvariabler.

Zonos vil registrere nøkkelen din og returnere organisasjons-ID-en din, som blir iss-kravet i alle JWT-påstander.

Signer en JWT med RS256 ved hjelp av den private nøkkelen din. Påstanden er gyldig for en enkelt tokenbytte — hold utløpsvinduet kort (60–300 sekunder).

Påkrevde krav 

KravVerdi
issDin Zonos-organisasjons-ID (f.eks. "org_abc123")
subIdentifiserer den kallende tjenesten (f.eks. "checkout-service")
audMå være nøyaktig "zonos-auth"
expUnix-tidsstempel; 60–300 sekunder fra iat
iatUnix-tidsstempel for utgivelse
jtiUnik UUID per påstand (gjør det mulig å oppdage gjentaking)

JWT-hodet må spesifisere "alg": "RS256" og "typ": "JWT".

Kodeeksempler 

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)

Send den signerte JWT-en til Zonos-tokenendepunktet for å motta en kortvarig Bearer-token.

Endepunkt 

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

application/x-www-form-urlencoded er også godtatt.

Forespørselsfelt 

FeltPåkrevdVerdi
grant_typeJa"urn:ietf:params:oauth:grant-type:jwt-bearer"
assertionJaDin signerte JWT (kompakt serialisering)

Forespørsel og respons 

1{
2 "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
3 "assertion": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
4}
ResponsefeltBeskrivelse
access_tokenBearer-token for alle påfølgende API-forespørsler
token_typeAlltid "Bearer"
expires_inSekunder til utløp (standard: 300)
scopeMellomromsseparerte tillatelser gitt til dette tokenet

Fullstendige kodeeksempler 

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"]

Inkluder tilgangstokenen som en Bearer-token i Authorization-hodet på hver Zonos API-forespørsel.

Eksempelforespørsel 

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

Tokenlevetid og caching 

Tilgangstokener utløper etter 5 minutter som standard. Cache tokenen og oppfrisk proaktivt — ikke be om et nytt token på hver API-anrop. Hver oppfrisking krever en nysignert JWT-påstand.

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"]

Feilreferanse 

Alle feil følger OAuth 2.0-feilresponsformatet (RFC 6749 §5.2):

1{
2 "error": "invalid_grant",
3 "error_description": "JWT assertion has expired"
4}
HTTP-statuserrorÅrsak
400unsupported_grant_typegrant_type var ikke urn:ietf:params:oauth:grant-type:jwt-bearer
400invalid_requestManglende eller dårlig utformet felt
401invalid_grantUgyldig signatur, utløpt påstand, ukjent org, eller uregistrert nøkkel
500server_errorIntern feil — kontakt Zonos-støtte hvis vedvarende

Vanlige årsaker til invalid_grant:

  • exp er i fortiden — sørg for at systemklokken din er NTP-synkronisert
  • aud er ikke nøyaktig "zonos-auth"
  • iss samsvarer ikke med din registrerte organisasjons-ID
  • Offentlig nøkkel ble rotert men ikke oppdatert med Zonos ennå

Beste praksis for sikkerhet 

  • Beskytt den private nøkkelen din. Lagre den i en dedikert hemmelighetsbehandler — aldri i versjonskontroll, miljøvariabler eller logger.
  • Hold påstander kortvarige. 60–300 sekunder er standard; det er ingen grunn til å utstede lengre.
  • Inkluder jti. En unik verdi per påstand gjør det mulig å oppdage gjentaking på serversiden.
  • Roter nøkkelpar med jevne mellomrom. Registrer en ny offentlig nøkkel med Zonos før du tilbakekaller den gamle for å unngå nedetid.
  • Logg aldri access_token eller assertion-verdier. Behandle begge som legitimasjon.
Bestill en demo

Var denne siden nyttig?