DOCS

Uwierzytelnianie OAuth 2.0

Uwierzytelnianie OAuth 2.0

Uwierzytelniaj usługi zaplecza w Zonos przy użyciu asymetrycznej kryptografii klucza — bez wspólnych tajemnic.

Zonos obsługuje uwierzytelnianie maszyna-do-maszyny za pośrednictwem OAuth 2.0 JWT Bearer Token Grant (RFC 7523). Twoja usługa podpisuje krótkotrwały JWT swoim prywatnym kluczem RSA; Zonos weryfikuje go za pomocą zarejestrowanego klucza publicznego i zwraca token nośnika ograniczony do twojej organizacji.

Podsumowanie przepływu:

  1. Wygeneruj parę kluczy RSA i zarejestruj swój klucz publiczny w Zonos.
  2. W czasie wykonywania podpisz asercję JWT swoim kluczem prywatnym i opublikuj ją w punkcie końcowym tokenu.
  3. Zonos zwraca krótkotrwały token dostępu.
  4. Dołącz token dostępu jako Authorization: Bearer <token> w każdym żądaniu API.

Wygeneruj parę kluczy RSA o rozmiarze 4096 bitów i udostępnij klucz publiczny w Zonos. Jest to wykonywane raz podczas wdrażania.

Wygeneruj parę kluczy 

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

Udostępnij plik public_key.pem w Zonos. Przechowuj plik private_key.pem w dedykowanym menedżerze tajemnic (AWS Secrets Manager, HashiCorp Vault, itp.) — nigdy w kontroli źródła lub zmiennych środowiskowych.

Zonos zarejestruje Twój klucz i zwróci Twój identyfikator organizacji, który staje się roszczeniem iss we wszystkich asercjach JWT.

Podpisz JWT za pomocą RS256 przy użyciu swojego klucza prywatnego. Asercja jest ważna dla pojedynczej wymiany tokenów — utrzymuj okno ważności krótkie (60–300 sekund).

Wymagane roszczenia 

RoszczenieWartość
issTwój identyfikator organizacji Zonos (np. "org_abc123")
subIdentyfikuje usługę wywołującą (np. "checkout-service")
audMusi być dokładnie "zonos-auth"
expZnacznik czasu Unix; 60–300 sekund od iat
iatZnacznik czasu Unix wydania
jtiUnikatowy UUID na asercję (umożliwia wykrywanie powtórzeń)

Nagłówek JWT musi określić "alg": "RS256" i "typ": "JWT".

Przykłady kodu 

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)

Wyślij podpisany JWT do punktu końcowego tokenu Zonos, aby otrzymać krótkotrwały token nośnika.

Punkt końcowy 

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

Obsługiwany jest również application/x-www-form-urlencoded.

Pola żądania 

PoleWymaganeWartość
grant_typeTak"urn:ietf:params:oauth:grant-type:jwt-bearer"
assertionTakTwój podpisany JWT (zwartej serializacji)

Żądanie i odpowiedź 

1{
2 "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
3 "assertion": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
4}
Pole odpowiedziOpis
access_tokenToken nośnika dla wszystkich kolejnych żądań API
token_typeZawsze "Bearer"
expires_inSekund do wygaśnięcia (domyślnie: 300)
scopeUprawnienia rozdzielone spacjami przyznane temu tokenowi

Pełne przykłady kodu 

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

Dołącz token dostępu jako token Bearer w nagłówku Authorization w każdym żądaniu API Zonos.

Przykładowe żądanie 

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

Cykl życia tokenu i buforowanie 

Tokeny dostępu wygasają w ciągu 5 minut domyślnie. Buforuj token i odśwież proaktywnie — nie żądaj nowego tokenu przy każdym wywołaniu API. Każde odświeżenie wymaga nowo podpisanej asercji JWT.

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

Odniesienie błędów 

Wszystkie błędy podlegają formatowi odpowiedzi błędu OAuth 2.0 (RFC 6749 §5.2):

1{
2 "error": "invalid_grant",
3 "error_description": "JWT assertion has expired"
4}
Kod stanu HTTPerrorPrzyczyna
400unsupported_grant_typegrant_type nie była urn:ietf:params:oauth:grant-type:jwt-bearer
400invalid_requestBrakujące lub nieprawidłowo sformatowane pole
401invalid_grantNieprawidłowy podpis, wygasła asercja, nieznana organizacja, lub niezarejestrowany klucz
500server_errorBłąd wewnętrzny — skontaktuj się z obsługą Zonos, jeśli problem się utrzymuje

Typowe przyczyny invalid_grant:

  • exp jest w przeszłości — upewnij się, że zegar systemu jest synchronizowany NTP
  • aud nie jest dokładnie "zonos-auth"
  • iss nie odpowiada zarejestrowanemu identyfikatorowi organizacji
  • Klucz publiczny został obrócony, ale nie został jeszcze zaktualizowany w Zonos

Najlepsze praktyki bezpieczeństwa 

  • Chroń swój klucz prywatny. Przechowuj go w dedykowanym menedżerze tajemnic — nigdy w kontroli źródła, zmiennych środowiskowych ani logach.
  • Utrzymuj asercje krótkotrwałe. 60–300 sekund jest standardowe; nie ma powodu, aby wydawać dłuższe.
  • Dołącz jti. Unikatowa wartość na asercję umożliwia wykrywanie powtórzeń po stronie serwera.
  • Obracaj pary kluczy okresowo. Zarejestruj nowy klucz publiczny w Zonos przed cofnięciem starego, aby uniknąć przestojów.
  • Nigdy nie rejestruj wartości access_token lub assertion. Traktuj oba jako poświadczenia.

Czy ta strona była pomocna?