DOCS

OAuth 2.0-autentisering

OAuth 2.0-autentisering

Autentisera era backend-tjänster med Zonos med hjälp av asymmetrisk nyckelkryptering — inga delade hemligheter.

Zonos stöder autentisering mellan maskiner via OAuth 2.0 JWT Bearer Token Grant (RFC 7523). Er tjänst signerar en kortlivad JWT med er privata RSA-nyckel; Zonos verifierar den med hjälp av er registrerade publika nyckel och returnerar en Bearer-token knuten till er organisation.

Sammanfattning av flödet:

  1. Generera ett RSA-nyckelpar och registrera er publika nyckel hos Zonos.
  2. Vid körning signerar ni en JWT-assertion med er privata nyckel och skickar den (POST) till token-endpointen.
  3. Zonos returnerar en kortlivad åtkomsttoken.
  4. Inkludera åtkomsttoken som Authorization: Bearer <token> i varje API-förfrågan.

Generera ett 4096-bitars RSA-nyckelpar och dela den publika nyckeln med Zonos. Detta görs en gång under onboardingen.

Generera nyckelparet 

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

Dela public_key.pem med Zonos. Lagra private_key.pem i en dedikerad hemlighetshanterare (AWS Secrets Manager, HashiCorp Vault, etc.) — aldrig i källkodshantering eller miljövariabler.

Zonos registrerar er nyckel och returnerar ert organisations-ID, som blir iss-claimet i alla JWT-assertions.

Signera en JWT med RS256 med hjälp av er privata nyckel. Assertionen gäller för ett enda tokenutbyte — håll giltighetsfönstret kort (60–300 sekunder).

Obligatoriska claims 

ClaimVärde
issErt Zonos-organisations-ID (t.ex. "org_abc123")
subIdentifierar den anropande tjänsten (t.ex. "checkout-service")
audMåste vara exakt "zonos-auth"
expUnix-tidsstämpel; 60–300 sekunder från iat
iatUnix-tidsstämpel för utfärdande
jtiUnikt UUID per assertion (möjliggör replay-detektering)

JWT-huvudet måste ange "alg": "RS256" och "typ": "JWT".

Kodexempel 

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)

Skicka den signerade JWT:n till Zonos token-endpoint för att få en kortlivad Bearer-token.

Endpoint 

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

application/x-www-form-urlencoded accepteras också.

Fält i förfrågan 

FältObligatorisktVärde
grant_typeJa"urn:ietf:params:oauth:grant-type:jwt-bearer"
assertionJaEr signerade JWT (kompakt serialisering)

Förfrågan och svar 

1{
2 "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
3 "assertion": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
4}
SvarsfältBeskrivning
access_tokenBearer-token för alla efterföljande API-förfrågningar
token_typeAlltid "Bearer"
expires_inSekunder tills token upphör (standard: 300)
scopeBlankstegsavgränsade behörigheter som tilldelats denna token

Fullständiga kodexempel 

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

Inkludera åtkomsttoken som en Bearer-token i Authorization-huvudet i varje Zonos API-förfrågan.

Exempelförfrågan 

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

Tokens livscykel och cachning 

Åtkomsttokens upphör att gälla efter 5 minuter som standard. Cacha token och förnya den proaktivt — begär inte en ny token vid varje API-anrop. Varje förnyelse kräver en nysignerad 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"]

Felreferens 

Alla fel följer OAuth 2.0:s format för felsvar (RFC 6749 §5.2):

1{
2 "error": "invalid_grant",
3 "error_description": "JWT assertion has expired"
4}
HTTP-statuserrorOrsak
400unsupported_grant_typegrant_type var inte urn:ietf:params:oauth:grant-type:jwt-bearer
400invalid_requestSaknat eller felaktigt formaterat fält
401invalid_grantOgiltig signatur, utgången assertion, okänd organisation eller oregistrerad nyckel
500server_errorInternt fel — kontakta Zonos support om problemet kvarstår

Vanliga orsaker till invalid_grant:

  • exp ligger i det förflutna — säkerställ att er systemklocka är NTP-synkroniserad
  • aud är inte exakt "zonos-auth"
  • iss matchar inte ert registrerade organisations-ID
  • Den publika nyckeln har roterats men ännu inte uppdaterats hos Zonos

Bästa praxis för säkerhet 

  • Skydda er privata nyckel. Lagra den i en dedikerad hemlighetshanterare — aldrig i källkodshantering, miljövariabler eller loggar.
  • Håll assertions kortlivade. 60–300 sekunder är standard; det finns ingen anledning att utfärda längre sådana.
  • Inkludera jti. Ett unikt värde per assertion möjliggör serversidans replay-detektering.
  • Rotera nyckelpar regelbundet. Registrera en ny publik nyckel hos Zonos innan ni återkallar den gamla för att undvika driftstopp.
  • Logga aldrig värden för access_token eller assertion. Behandla båda som autentiseringsuppgifter.
Boka en demo

Var den här sidan till hjälp?