DOCS

Autenticação OAuth 2.0

Autenticação OAuth 2.0

Autentique seus serviços de back-end com Zonos usando criptografia de chave assimétrica — sem segredos compartilhados.

Zonos suporta autenticação máquina a máquina viaConcessão de token ao portador JWT OAuth 2.0 (RFC 7523). Seu serviço assina um JWT de curta duração com sua chave privada RSA; Zonos verifica usando sua chave pública registrada e retorna um token de portador com escopo para sua organização.

Resumo do fluxo:

  1. Gere um par de chaves RSA e registre seuchave públicacom Zonos.
  2. Em tempo de execução, assine uma declaração JWT com seuchave privadae POST no endpoint do token.
  3. Zonos retorna um valor de curta duraçãotoken de acesso.
  4. Inclua o token de acesso comoAuthorization: Bearer <token>em cada solicitação API.

Gere um par de chaves RSA de 4096 bits e compartilhe a chave pública com Zonos. Isso é feito uma vez durante a integração.

Gere o par de chaves 

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

Compartilharpublic_key.pemcom Zonos. Lojaprivate_key.pemem um gerenciador de segredos dedicado (AWS Secrets Manager, HashiCorp Vault, etc.) — nunca em controle de origem ou variáveis ​​de ambiente.

Zonos registrará sua chave e retornará seuID da organização, que se torna oissreivindicação em todas as asserções JWT.

Assine um JWT comRS256usando sua chave privada. A afirmação é válida para uma única troca de token – mantenha a janela de expiração curta (60–300 segundos).

Reivindicações obrigatórias 

ClaimValue
issYour Zonos Organization ID (e.g. "org_abc123")
subIdentifies the calling service (e.g. "checkout-service")
audMust be exactly "zonos-auth"
expCarimbo de data/hora Unix; 60–300 segundos de iat
iatUnix timestamp of issuance
jtiUUID exclusivo por asserção (permite detecção de repetição)

O cabeçalho JWT deve especificar"alg": "RS256"e"typ": "JWT".

Exemplos de código 

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)

Envie o JWT assinado para o endpoint do token Zonos para receber um token Bearer de curta duração.

Ponto final 

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

application/x-www-form-urlencodedtambém é aceito.

Campos de solicitação 

FieldRequiredValue
grant_typeYes"urn:ietf:params:oauth:grant-type:jwt-bearer"
assertionYesYour signed JWT (compact serialization)

Solicitação e resposta 

1{
2 "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
3 "assertion": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
4}
Response fieldDescription
access_tokenToken de portador para todas as solicitações API subsequentes
token_typeAlways "Bearer"
expires_inSegundos até a expiração (padrão: 300)
scopeSpace-separated permissions granted to this token

Exemplos de código completo 

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

Inclua o token de acesso como umBearerficha noAuthorizationcabeçalho em cada solicitação Zonos API.

Solicitação de exemplo 

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

Ciclo de vida e cache do token 

Os tokens de acesso expiram em 5 minutos por padrão. Armazene o token em cache e atualize proativamente — não solicite um novo token em cada chamada API. Cada atualização requer uma declaração JWT recém-assinada.

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

Referência de erro 

Todos os erros seguem o formato de resposta de erro do OAuth 2.0 (RFC 6749 §5.2):

1{
2 "error": "invalid_grant",
3 "error_description": "JWT assertion has expired"
4}
HTTP StatuserrorCause
400unsupported_grant_typegrant_typenão foiurn:ietf:params:oauth:grant-type:jwt-bearer
400invalid_requestMissing or malformed field
401invalid_grantAssinatura inválida, declaração expirada, organização desconhecida ou chave não registrada
500server_errorErro interno – entre em contato com o suporte Zonos se persistir

Comuminvalid_grantcausas:

  • expestá no passado - certifique-se de que o relógio do seu sistema esteja sincronizado com NTP
  • audnão é exatamente"zonos-auth"
  • issnão corresponde ao seu ID de organização registrado
  • A chave pública foi rotacionada, mas ainda não atualizada com Zonos

Melhores práticas de segurança 

  • **Proteja sua chave privada.**Armazene-o em um gerenciador de segredos dedicado — nunca em controle de origem, variáveis ​​de ambiente ou logs.
  • **Mantenha as afirmações de curta duração.**60–300 segundos é o padrão; não há razão para emitir outros mais longos.
  • Incluirjti. Um valor exclusivo por asserção permite a detecção de reprodução no lado do servidor.
  • **Gire os pares de chaves periodicamente.**Registre uma nova chave pública com Zonos antes de revogar a antiga para evitar tempo de inatividade.
  • Nunca registreaccess_token or assertionvalores. Trate ambos como credenciais.

Esta página foi útil?