DOCS

OAuth 2.0 kimlik doğrulaması

OAuth 2.0 kimlik doğrulaması

Asimetrik anahtar şifrelemesi kullanarak Zonos ile arka uç hizmetlerinizi doğrulayın — paylaşılan sırlar yok.

Zonos, OAuth 2.0 JWT Bearer Token Grant (RFC 7523) aracılığıyla makine-makine kimlik doğrulamasını destekler. Hizmetiniz RSA özel anahtarınızla kısa ömürlü bir JWT imzalar; Zonos, kayıtlı ortak anahtarınızı kullanarak doğrular ve kuruluşunuza kapsamlı bir Bearer belirteci döndürür.

Akış özeti:

  1. Bir RSA anahtar çifti oluşturun ve ortak anahtarınızı Zonos'a kaydedin.
  2. Çalışma zamanında, özel anahtarınızla bir JWT iddiasını imzalayın ve belirteç uç noktasına gönderin.
  3. Zonos kısa ömürlü bir erişim belirteci döndürür.
  4. Her API isteğinde erişim belirtecini Authorization: Bearer <token> olarak ekleyin.

4096 bitlik RSA anahtar çifti oluşturun ve ortak anahtarı Zonos'a gönderin. Bu, ekleme sırasında bir kez yapılır.

Anahtar çiftini oluşturun 

1# Özel anahtarı oluşturun
2openssl genrsa -out private_key.pem 4096
3 
4 
5openssl rsa - private_key.pem -pubout -out public_key.pem

public_key.pem dosyasını Zonos'a gönderin. private_key.pem dosyasını bir özel sırlar yöneticisinde saklayın (AWS Secrets Manager, HashiCorp Vault, vb.) — asla kaynak kontrolünde veya ortam değişkenlerinde saklamayın.

Zonos anahtarınızı kaydettiğinde Kuruluş Kimliğinizi döndürür, bu da tüm JWT onaylamalarında iss talebi olur.

RS256 kullanarak özel anahtarınızla bir JWT imzalayın. İddia tek bir belirteç değişimi için geçerlidir — son kullanma penceresini kısa tutun (60–300 saniye).

Gerekli talepler 

TalepDeğer
issZonos Kuruluş Kimliğiniz (örn. "org_abc123")
subÇağıran hizmeti tanımlar (örn. "checkout-service")
audTam olarak "zonos-auth" olmalı
expUnix zaman damgası; iat öğesinden 60–300 saniye
iatVeriliş Unix zaman damgası
jtiİddia başına benzersiz UUID (yeniden yürütme tespitini etkinleştirir)

JWT başlığı "alg": "RS256" ve "typ": "JWT" belirtmelidir.

Kod örnekleri 

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)

İmzalı JWT'yi Zonos belirteç uç noktasına göndererek kısa ömürlü bir Bearer belirteci alın.

Uç nokta 

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

application/x-www-form-urlencoded de kabul edilir.

İstek alanları 

AlanGerekliDeğer
grant_typeEvet"urn:ietf:params:oauth:grant-type:jwt-bearer"
assertionEvetİmzalanmış JWT'niz (kompakt seri hale getirme)

İstek ve yanıt 

1{
2 "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
3 "assertion": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
4}
Yanıt alanıAçıklama
access_tokenSonraki tüm API istekleri için Bearer belirteci
token_typeHer zaman "Bearer"
expires_inSon kullanmaya kadar geçen saniyeler (varsayılan: 300)
scopeBu belirtece verilen boşlukla ayrılmış izinler

Tam kod örnekleri 

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

Erişim belirtecini Authorization başlığında Bearer belirteci olarak her Zonos API isteğine ekleyin.

Örnek istek 

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

Belirteç yaşam döngüsü ve önbelleğe alma 

Erişim belirtecileri varsayılan olarak 5 dakika içinde sona erer. Belirteci önbelleğe alın ve proaktif olarak yenileyin — her API çağrısında yeni bir belirteç istemeyin. Her yenileme yeni bir imzalanmış JWT iddiası gerektirir.

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

Hata referansı 

Tüm hatalar OAuth 2.0 hata yanıtı biçimini izler (RFC 6749 §5.2):

1{
2 "error": "invalid_grant",
3 "error_description": "JWT assertion has expired"
4}
HTTP DurumerrorNeden
400unsupported_grant_typegrant_type tam olarak urn:ietf:params:oauth:grant-type:jwt-bearer değildi
400invalid_requestEksik veya hatalı biçimlendirilmiş alan
401invalid_grantGeçersiz imza, süresi dolmuş iddia, bilinmeyen kuruluş veya kayıtlı olmayan anahtar
500server_errorİç hata — devam ederse Zonos desteğine başvurun

Yaygın invalid_grant nedenleri:

  • exp geçmişte — sistem saatinizin NTP ile senkronize olduğundan emin olun
  • aud tam olarak "zonos-auth" değil
  • iss kayıtlı Kuruluş Kimliğinizle eşleşmiyor
  • Ortak anahtar döndürüldü ancak henüz Zonos'ta güncellenmedi

Güvenlik en iyi uygulamaları 

  • Özel anahtarınızı koruyun. Bunu bir özel sırlar yöneticisinde saklayın — asla kaynak kontrolünde, ortam değişkenlerinde veya günlüklerde saklamayın.
  • İddiaları kısa ömürlü tutun. 60–300 saniye standarttır; daha uzun olanları vermeyin.
  • jti ekleyin. İddia başına benzersiz bir değer sunucu tarafı yeniden yürütme tespitini etkinleştirir.
  • Anahtar çiftlerini düzenli olarak döndürün. Eski olanı iptal etmeden önce Zonos'a yeni bir ortak anahtar kaydedin.
  • Hiçbir zaman access_token veya assertion değerlerini günlüğe kaydetmeyin. Her ikisini de kimlik bilgileri olarak değerlendirin.

Bu sayfa faydalı mıydı?