Autenticação: chaves de API e OAuth
Tokens do tipo portador, cabeçalhos de chaves de API e fluxos OAuth2 para acesso de agentes a APIs.
Autenticação: chaves de API e OAuth é uma aula grátis de AI Agents no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Agents, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Agents inclui 4 aulas no total.
Por que a autenticação é importante para os agentes
Quando seu agente chama uma API externa, o servidor precisa saber quem está fazendo a solicitação. A autenticação comprova a identidade; a autorização determina o que você pode fazer. Sem autenticação adequada, toda solicitação retorna 401 Unauthorized e seu agente não consegue fazer nada.
Dois padrões dominam o desenvolvimento de agentes: chaves de API e OAuth 2.0.
import requests
# Without auth — will get 401
response = requests.get('https://api.openai.com/v1/models')
print(response.status_code) # 401 Unauthorized
# With API key in header — works
headers = {'Authorization': 'Bearer sk-proj-abc123'}
response = requests.get(
'https://api.openai.com/v1/models',
headers=headers
)
print(response.status_code) # 200Chave de API no cabeçalho de autorização
O padrão mais comum é enviar sua chave de API no cabeçalho Authorization como um token de portador. A palavra "Bearer" indica que quem possui esse token está autorizado: o servidor confia no portador da chave.
Esse padrão é usado pela OpenAI, Anthropic, GitHub e pela maioria das APIs modernas.
import requests
import os
api_key = os.environ['OPENAI_API_KEY']
response = requests.post(
'https://api.openai.com/v1/chat/completions',
headers={
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
},
json={
'model': 'gpt-4o-mini',
'messages': [{'role': 'user', 'content': 'Hello!'}]
}
)
print(response.json()['choices'][0]['message']['content'])Chave de API em cabeçalho personalizado (X-API-Key)
Algumas APIs, especialmente as mais antigas ou internas, usam um cabeçalho personalizado como X-API-Key em vez de Authorization: Bearer. O padrão é o mesmo, apenas com um nome de cabeçalho diferente. Sempre consulte a documentação da API para saber o nome exato do cabeçalho esperado.
import requests
import os
api_key = os.environ['SERVICE_API_KEY']
response = requests.get(
'https://api.someservice.com/v1/data',
headers={
'X-API-Key': api_key,
'Accept': 'application/json'
}
)
if response.status_code == 200:
data = response.json()
print('Got data:', data)
elif response.status_code == 401:
print('Invalid API key — check X-API-Key header')Armazenamento de credenciais em variáveis de ambiente
Nunca insira chaves de API diretamente no código-fonte. Se você enviar uma chave para um repositório público, robôs vão encontrá-la e usá-la indevidamente em questão de segundos. O padrão correto é armazenar as credenciais em variáveis de ambiente e lê-las durante a execução com os.environ.
Use os.environ.get() com uma mensagem de erro clara caso a chave esteja ausente.
import os
os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123xyz789' # simulate a set env var
api_key = os.environ.get('OPENAI_API_KEY')
if not api_key:
raise EnvironmentError(
'OPENAI_API_KEY environment variable not set. '
'Run: export OPENAI_API_KEY=your-key-here'
)
print('API key loaded from environment (never hard-code it in source)')Desenvolvimento local com python-dotenv
Durante o desenvolvimento, mantenha suas chaves em um arquivo .env na raiz do projeto. Use a biblioteca python-dotenv para carregá-las automaticamente. Adicione .env ao seu .gitignore para que ele nunca seja enviado ao repositório.
# .env file (never commit this!)
# OPENAI_API_KEY=sk-proj-abc123
# ANTHROPIC_API_KEY=sk-ant-xyz456
# GITHUB_TOKEN=ghp_abc789
# In your Python code:
from dotenv import load_dotenv
import os
load_dotenv() # loads .env into os.environ
openai_key = os.environ['OPENAI_API_KEY']
anthropic_key = os.environ['ANTHROPIC_API_KEY']
github_token = os.environ['GITHUB_TOKEN']
print('Keys loaded successfully')O que é OAuth 2.0?
OAuth 2.0 é um padrão para autorização delegada. Em vez de fornecer ao seu agente a senha de um usuário, o OAuth permite que o usuário autorize seu agente a agir em seu nome, com um escopo limitado e uma janela de tempo definida. Ele é usado pelo Google, GitHub, Slack e Salesforce.
O conceito fundamental é que seu agente obtém um token de acesso após um fluxo de autorização e então usa esse token nas chamadas de API.
# OAuth flow overview:
#
# 1. Agent redirects user to:
# https://auth.provider.com/oauth/authorize
# ?client_id=YOUR_CLIENT_ID
# &redirect_uri=http://localhost:8080/callback
# &scope=read:repo%20write:issues
# &response_type=code
#
# 2. User logs in and grants permission
# 3. Provider redirects to your callback with ?code=AUTH_CODE
# 4. Agent exchanges code for access_token
# 5. Agent uses access_token for API calls
print('OAuth flow: authorize -> code -> token -> API calls')Fluxo de credenciais do cliente do OAuth2
O fluxo de credenciais do cliente é o fluxo OAuth mais simples para agentes — não requer interação do usuário. Seu agente se autentica com o próprio ID e segredo do cliente para obter um token. Esse fluxo é usado na comunicação máquina a máquina (M2M).
Você envia suas credenciais por POST ao ponto de acesso do token e recebe um token de acesso de curta duração.
import requests
import os
client_id = os.environ['OAUTH_CLIENT_ID']
client_secret = os.environ['OAUTH_CLIENT_SECRET']
token_url = 'https://auth.example.com/oauth/token'
# Request an access token
response = requests.post(token_url, data={
'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret,
'scope': 'read:data write:tasks'
})
token_data = response.json()
access_token = token_data['access_token']
expires_in = token_data['expires_in'] # seconds
print(f'Token valid for {expires_in}s')Usando tokens OAuth em chamadas de API
Depois de obter um token de acesso OAuth, use-o exatamente como uma chave de API — no cabeçalho Authorization: Bearer. A diferença é que os tokens OAuth expiram, portanto seu agente precisa atualizar o token antes de fazer chamadas.
import requests
import os
import time
class OAuthClient:
def __init__(self, client_id, client_secret, token_url):
self.client_id = client_id
self.client_secret = client_secret
self.token_url = token_url
self.access_token = None
self.token_expiry = 0
def get_token(self):
if time.time() < self.token_expiry - 60: # 60s buffer
return self.access_token
r = requests.post(self.token_url, data={
'grant_type': 'client_credentials',
'client_id': self.client_id,
'client_secret': self.client_secret
})
data = r.json()
self.access_token = data['access_token']
self.token_expiry = time.time() + data['expires_in']
return self.access_token
def get(self, url):
token = self.get_token()
return requests.get(url, headers={'Authorization': f'Bearer {token}'})OAuth 2.0 com a biblioteca google-auth
Para as APIs do Google, a biblioteca google-auth cuida de toda a complexidade do OAuth para você. Ela atualiza os tokens automaticamente, lê as credenciais de um arquivo JSON e anexa os tokens às solicitações por meio de uma AuthorizedSession.
from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
# Load service account credentials from JSON file
credentials = service_account.Credentials.from_service_account_file(
'service-account.json',
scopes=[
'https://www.googleapis.com/auth/gmail.readonly',
'https://www.googleapis.com/auth/calendar.events'
]
)
# AuthorizedSession auto-refreshes tokens
session = AuthorizedSession(credentials)
response = session.get(
'https://www.googleapis.com/gmail/v1/users/me/messages'
)
print(response.json())Práticas recomendadas de segurança para chaves de API
Proteger as chaves de API é fundamental para a segurança do agente. Siga estas regras:
- Armazene as chaves em variáveis de ambiente ou em um gerenciador de segredos (AWS Secrets Manager, HashiCorp Vault)
- Nunca registre as chaves — mascare-as na saída
- Altere as chaves regularmente e revogue imediatamente as que forem comprometidas
- Use o princípio do menor privilégio — solicite apenas os escopos de que seu agente precisa
- Configure listas de IPs permitidos nas chaves de API quando o provedor oferecer suporte a esse recurso
import os
os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123xyz789'
def get_key(env_var):
key = os.environ.get(env_var)
if not key:
raise EnvironmentError(f'Missing required env var: {env_var}')
return key
def mask_key(key):
if len(key) < 8:
return '***'
return key[:4] + '...' + key[-4:]
api_key = get_key('OPENAI_API_KEY')
print(f'Using key: {mask_key(api_key)}')Lidando com 401 Não autorizado no seu agente
Quando um agente recebe uma resposta 401 Unauthorized, ele nunca deve tentar novamente às cegas — isso desperdiça a cota de limitação de taxa. Em vez disso, verifique se o token expirou (tente atualizá-lo) ou se a própria chave é inválida (alerte imediatamente para que uma pessoa possa corrigir o problema).
import requests
import os
def call_api_with_auth_check(url, api_key):
response = requests.get(
url,
headers={'Authorization': f'Bearer {api_key}'}
)
if response.status_code == 401:
error = response.json().get('error', {})
code = error.get('code', 'unknown')
if code == 'token_expired':
print('Token expired — refresh needed')
# trigger token refresh flow
else:
raise PermissionError(
f'API key rejected: {error.get("message", "401 Unauthorized")}'
)
response.raise_for_status()
return response.json()Verificação rápida: armazenamento de chave de API
Teste sua compreensão sobre o gerenciamento de credenciais.
Recapitulação da autenticação
Você aprendeu os dois principais padrões de autenticação para agentes:
- Chaves de API — enviadas no cabeçalho
Authorization: Bearer TOKENouX-API-Key; simples e sem estado - OAuth 2.0 — fluxo de credenciais do cliente para M2M; os tokens expiram e precisam ser atualizados
- Sempre armazene as chaves em variáveis de ambiente, nunca no código-fonte
- Use python-dotenv localmente; em produção, use variáveis de ambiente ou gerenciadores de segredos
- Lide com respostas 401 verificando se o token expirou ou se a chave é inválida
Um tratamento sólido da autenticação é a base de todo agente confiável.
Perguntas Frequentes
A aula “Autenticação: chaves de API e OAuth” é grátis?
Sim — o texto completo de “Autenticação: chaves de API e OAuth” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Agents, atualize para CoddyKit PRO. O curso de AI Agents inclui 4 aulas no total.
O que vou aprender em “Autenticação: chaves de API e OAuth”?
Tokens do tipo portador, cabeçalhos de chaves de API e fluxos OAuth2 para acesso de agentes a APIs. Você pratica AI Agents com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Agents?
Nenhuma experiência prévia é necessária. AI Agents no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Autenticação: chaves de API e OAuth”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Agents?
Sim. Cada aula de AI Agents inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Fundamentos da API REST para desenvolvedores de agentes
- Autenticação: chaves de API e OAuth
- Lidando com respostas e erros de APIs
- Limitação de taxa e lógica de novas tentativas