DOCS

OAuth 2.0-godkendelse

OAuth 2.0-godkendelse

Godkend dine backend-tjenester hos Zonos med asymmetrisk nøglekryptografi — uden delte hemmeligheder.

Zonos understøtter maskine-til-maskine-godkendelse via OAuth 2.0 JWT Bearer Token Grant (RFC 7523). Din tjeneste signerer en kortvarig JWT med din RSA-private nøgle; Zonos verificerer den ved hjælp af din registrerede offentlige nøgle og returnerer et Bearer-token med scope til din organisation.

Flow-oversigt:

  1. Generer et RSA-nøglepar, og registrer din offentlige nøgle hos Zonos.
  2. Ved kørsel signerer du en JWT-assertion med din private nøgle og sender den med POST til token-endpointet.
  3. Zonos returnerer et kortvarigt adgangstoken.
  4. Inkluder adgangstokenet som Authorization: Bearer <token> i hver API-anmodning.

Generer et 4096-bit RSA-nøglepar, og del den offentlige nøgle med Zonos. Dette gøres én gang under onboarding.

Generer nøgleparret 

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. Opbevar private_key.pem i en dedikeret secrets manager (AWS Secrets Manager, HashiCorp Vault osv.) — aldrig i source control eller miljøvariabler.

Zonos registrerer din nøgle og returnerer dit Organization ID, som bliver iss-claim i alle JWT-assertions.

Signer en JWT med RS256 ved hjælp af din private nøgle. Assertionen er gyldig til et enkelt token-udveksling — hold udløbsvinduet kort (60–300 sekunder).

Påkrævede claims 

ClaimVærdi
issDit Zonos Organization ID (f.eks. "org_abc123")
subIdentificerer den kaldende tjeneste (f.eks. "checkout-service")
audSkal være præcis "zonos-auth"
expUnix-tidsstempel; 60–300 sekunder fra iat
iatUnix-tidsstempel for udstedelse
jtiUnikt UUID pr. assertion (muliggør replay-detektion)

JWT-headeren skal angive "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 signerede JWT til Zonos' token-endpoint for at modtage et kortvarigt Bearer-token.

Endpoint 

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

application/x-www-form-urlencoded accepteres også.

Anmodningsfelter 

FeltPåkrævetVærdi
grant_typeJa"urn:ietf:params:oauth:grant-type:jwt-bearer"
assertionJaDin signerede JWT (kompakt serialisering)

Anmodning og svar 

1{
2 "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
3 "assertion": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
4}
SvarfeltBeskrivelse
access_tokenBearer-token til alle efterfølgende API-anmodninger
token_typeAltid "Bearer"
expires_inSekunder indtil udløb (standard: 300)
scopeMellemrumseparerede tilladelser tildelt dette token

Fulde 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 adgangstokenet som et Bearer-token i Authorization-headeren i hver Zonos API-anmodning.

Eksempelanmodning 

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

Tokenlivscyklus og caching 

Adgangstokens udløber som standard efter 5 minutter. Cache tokenet, og forny proaktivt — anmod ikke om et nyt token ved hvert API-kald. Hver fornyelse kræver en ny signerede JWT-assertion.

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

Fejlreference 

Alle fejl følger OAuth 2.0 fejlresponsformatet (RFC 6749 §5.2):

1{
2 "error": "invalid_grant",
3 "error_description": "JWT assertion has expired"
4}
HTTP-statuserrorÅrsag
400unsupported_grant_typegrant_type var ikke urn:ietf:params:oauth:grant-type:jwt-bearer
400invalid_requestManglende eller fejlformateret felt
401invalid_grantUgyldig signatur, udløbet assertion, ukendt org eller uregistreret nøgle
500server_errorIntern fejl — kontakt Zonos support, hvis den vedvarer

Almindelige årsager til invalid_grant:

  • exp ligger i fortiden — sørg for, at dit systemur er NTP-synkroniseret
  • aud er ikke præcis "zonos-auth"
  • iss matcher ikke dit registrerede Organization ID
  • Offentlig nøgle blev roteret, men er endnu ikke opdateret hos Zonos

Sikkerhedsbedste praksis 

  • Beskyt din private nøgle. Opbevar den i en dedikeret secrets manager — aldrig i source control, miljøvariabler eller logs.
  • Hold assertions kortvarige. 60–300 sekunder er standard; der er ingen grund til at udstede længere.
  • Inkluder jti. En unik værdi pr. assertion muliggør replay-detektion på serversiden.
  • Roter nøglepar periodisk. Registrer en ny offentlig nøgle hos Zonos, før du tilbagekalder den gamle, for at undgå nedetid.
  • Log aldrig access_token- eller assertion-værdier. Behandl begge som legitimationsoplysninger.
Book en demo

Var denne side nyttig?