Pular para o conteúdo principal

Autenticação

Quick Reference

WhatAutenticação OAuth 2.0 via AWS Cognito
WhyObtenha um token Bearer para autorizar cada requisição à API — com cache pronto para produção
Reading Time5 min
DifficultyBeginner
PrerequisitesIntrodução

Por que a autenticação baseada em token é importante

Sem gerenciamento adequado de autenticaçãoCom as boas práticas da A55
Nova requisição de token a cada chamada à API — lento e sujeito a rate limitArmazene e reutilize o token por até 1 hora
Credenciais espalhadas em código, configs e logsUma única entrada no gerenciador de segredos, zero exposição
Tokens expirados causam falhas 401 silenciosas em produçãoRenovação proativa antes da expiração mantém uptime de 100%
Depurar problemas de autenticação desperdiça horas de integraçãoUm fluxo, um endpoint, um formato de token — JWT em toda parte
Como funciona

Troque client_id + client_secret por um access_token JWT (válido por 1 hora). Envie esse token como Authorization: Bearer <token> em cada chamada à API. Renove antes de expirar.


Fluxo de autenticação


Passo 1 — Solicitar um access token

ConfiguraçãoValor
Endpointhttps://smart-capital.auth.us-east-1.amazoncognito.com/oauth2/token
MétodoPOST
Content-Typeapplication/x-www-form-urlencoded
CampoValor
grant_typeclient_credentials
client_idSeu client ID OAuth 2.0
client_secretSeu client secret OAuth 2.0
curl -s -X POST \
https://smart-capital.auth.us-east-1.amazoncognito.com/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET"

Passo 2 — Entender a resposta do token

{
"access_token": "eyJraWQiOiJLTzZ...",
"expires_in": 3600,
"token_type": "Bearer"
}
CampoTipoDescrição
access_tokenstringJWT usado como token Bearer em cada requisição à API
expires_inintegerTempo de vida do token em segundos (padrão 3600 = 1 hora)
token_typestringSempre Bearer
Decodifique o JWT

Cole seu access_token no jwt.io durante o desenvolvimento para inspecionar claims, escopos e expiração. Nunca faça isso com tokens de produção em sites não confiáveis.


Passo 3 — Chamar a API

Envie Authorization: Bearer <access_token> em cada requisição.

curl -s -X GET \
https://core-manager.a55.tech/api/v1/wallets \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"

Passo 4 — Armazenar em cache e renovar tokens

Tokens duram 1 hora. Solicite um novo antes de expirar — nunca espere por um 401.

import time
import requests

class A55Client:
AUTH_URL = "https://smart-capital.auth.us-east-1.amazoncognito.com/oauth2/token"
API_BASE = "https://core-manager.a55.tech/api/v1"
REFRESH_MARGIN = 300 # renovar 5 min antes da expiração

def __init__(self, client_id: str, client_secret: str):
self._client_id = client_id
self._client_secret = client_secret
self._token = None
self._token_expiry = 0

def _refresh_token(self):
resp = requests.post(self.AUTH_URL, data={
"grant_type": "client_credentials",
"client_id": self._client_id,
"client_secret": self._client_secret,
}, headers={"Content-Type": "application/x-www-form-urlencoded"})
resp.raise_for_status()
data = resp.json()
self._token = data["access_token"]
self._token_expiry = time.time() + data["expires_in"] - self.REFRESH_MARGIN

@property
def token(self) -> str:
if not self._token or time.time() >= self._token_expiry:
self._refresh_token()
return self._token

def request(self, method: str, endpoint: str, **kwargs):
headers = {
"Authorization": f"Bearer {self.token}",
"Content-Type": "application/json",
}
resp = requests.request(method, f"{self.API_BASE}/{endpoint}", headers=headers, **kwargs)
resp.raise_for_status()
return resp.json()

# Exemplo de uso
client = A55Client("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET")
wallets = client.request("GET", "wallets")
print(wallets)

Checklist de gerenciamento de tokens

PráticaPor quê
Armazene tokens em cache por até 55 minutosEvita chamadas desnecessárias ao Cognito e limites de taxa
Renove 5 minutos antes de expires_inPrevine erros 401 durante chamadas à API
Armazene o client_secret em um gerenciador de segredosVariáveis de ambiente vazam em logs; gerenciadores de segredos não
Nunca registre tokens ou segredos em logsUm token vazado concede acesso total à API por 1 hora
Use HTTPS em toda parteTokens em HTTP texto plano podem ser interceptados
Rotacione segredos periodicamenteLimita o raio de impacto se uma credencial for comprometida
O client secret é uma senha

Trate o client_secret como uma senha de banco de dados: armazene apenas no backend, nunca em navegadores, aplicativos mobile, logs de CI ou repositórios públicos. Se comprometido, envie um e-mail para tech.services@a55.tech imediatamente para rotação.


Respostas de erro

Status HTTPSignificadoO que fazer
401 UnauthorizedToken expirado ou inválidoRenove o token e tente novamente
400 Bad RequestRequisição de autenticação malformadaVerifique grant_type, client_id, client_secret
429 Too Many RequestsLimite de taxa atingido no CognitoImplemente backoff exponencial; armazene seus tokens em cache

Solicite credenciais

Envie um e-mail para tech.services@a55.tech com o nome da sua empresa, contato técnico e caso de uso esperado para receber client_id e client_secret para sandbox e produção.