Autenticazione: API key e OAuth
Bearer token, header con API key e flussi OAuth2 per l’accesso degli agenti alle API
Autenticazione: API key e OAuth è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.
Perché l'autenticazione è importante per gli agenti
Quando l'agente chiama un'API esterna, il server deve sapere chi sta effettuando la richiesta. L'autenticazione dimostra l'identità; l'autorizzazione determina quali operazioni è possibile eseguire. Senza un'autenticazione corretta, ogni richiesta restituisce 401 Unauthorized e l'agente non può fare nulla.
Nello sviluppo degli agenti predominano due approcci: le chiavi 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) # 200Chiave API nell'intestazione Authorization
L'approccio più comune consiste nell'inviare la chiave API nell'intestazione Authorization come token Bearer. La parola "Bearer" indica che chiunque disponga di questo token è autorizzato: il server si fida del possessore della chiave.
Questo approccio è utilizzato da OpenAI, Anthropic, GitHub e dalla maggior parte delle API moderne.
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'])Chiave API in un'intestazione personalizzata (X-API-Key)
Alcune API, soprattutto quelle meno recenti o interne, utilizzano un'intestazione personalizzata come X-API-Key invece di Authorization: Bearer. L'approccio è lo stesso, cambia solo il nome dell'intestazione. Controlli sempre la documentazione dell'API per verificare il nome esatto dell'intestazione previsto.
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')Memorizzare le credenziali nelle variabili d'ambiente
Non inserisca mai le chiavi API direttamente nel codice sorgente. Se esegue il commit di una chiave in un repository pubblico, i bot la troveranno e ne faranno un uso improprio nel giro di pochi secondi. L'approccio corretto consiste nel memorizzare le credenziali nelle variabili d'ambiente e leggerle in fase di esecuzione con os.environ.
Utilizzi os.environ.get() e mostri un messaggio di errore chiaro se la chiave è mancante.
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)')Utilizzare python-dotenv per lo sviluppo locale
Durante lo sviluppo, conservi le chiavi in un file .env nella directory principale del progetto. Utilizzi la libreria python-dotenv per caricarle automaticamente. Aggiunga .env al file .gitignore per evitare che venga incluso nei commit.
# .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')Che cos'è OAuth 2.0?
OAuth 2.0 è uno standard per l'autorizzazione delegata. Invece di fornire all'agente la password dell'utente, OAuth consente all'utente di autorizzare l'agente ad agire per suo conto, con un ambito e un periodo di validità limitati. È utilizzato da Google, GitHub, Slack e Salesforce.
Il concetto fondamentale è che l'agente riceve un token di accesso al termine di un flusso di autorizzazione e poi utilizza quel token per le chiamate 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')Flusso OAuth2 con credenziali client
Il flusso delle credenziali client è il flusso OAuth più semplice per gli agenti: non richiede interazione dell'utente. L'agente si autentica usando il proprio ID client e il proprio segreto per ottenere un token. Viene utilizzato per la comunicazione machine-to-machine (M2M).
Si inviano le proprie credenziali all'endpoint dei token tramite POST e si riceve un token di accesso a breve durata.
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')Utilizzo dei token OAuth nelle chiamate API
Una volta ottenuto un token di accesso OAuth, lo si utilizza esattamente come una chiave API, nell'intestazione Authorization: Bearer. La differenza è che i token OAuth scadono, quindi l'agente deve gestire il rinnovo del token prima di effettuare le chiamate.
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 con la libreria google-auth
Per le API Google, la libreria google-auth gestisce per Lei tutta la complessità di OAuth. Gestisce automaticamente il rinnovo dei token, legge le credenziali da un file JSON e associa i token alle richieste tramite una 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())Best practice per la sicurezza delle chiavi API
Proteggere le chiavi API è fondamentale per la sicurezza degli agenti. Segua queste regole:
- Conservi le chiavi nelle variabili d'ambiente o in un gestore dei segreti (AWS Secrets Manager, HashiCorp Vault)
- Non registri mai le chiavi: le mascheri nell'output
- Ruoti regolarmente le chiavi e revochi immediatamente quelle compromesse
- Applichi il principio del privilegio minimo: richieda solo gli ambiti necessari all'agente
- Imposti elenchi di IP consentiti per le chiavi API quando il provider lo supporta
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)}')Gestione di 401 Unauthorized nel proprio agente
Quando un agente riceve una risposta 401 Unauthorized, non deve mai ritentare alla cieca: sprecherebbe la quota del rate limit. Verifichi invece se il token è scaduto (provando a rinnovarlo) o se la chiave non è valida (segnalandolo immediatamente, così una persona può risolvere il 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 rapida: archiviazione delle chiavi API
Verifichi la propria comprensione della gestione delle credenziali.
Riepilogo dell'autenticazione
Ha appreso i principali modelli di autenticazione per gli agenti:
- Chiavi API: passate nell'intestazione
Authorization: Bearer TOKENoX-API-Key; semplici e senza stato - OAuth 2.0: flusso delle credenziali client per M2M; i token scadono e devono essere rinnovati
- Conservi sempre le chiavi nelle variabili d'ambiente, mai nel codice sorgente
- Utilizzi python-dotenv localmente; in produzione utilizzi variabili d'ambiente o gestori dei segreti
- Gestisca le risposte 401 verificando se il token è scaduto o se la chiave non è valida
Una gestione solida dell'autenticazione è la base di ogni agente affidabile.
Domande Frequenti
La lezione «Autenticazione: API key e OAuth» è gratuita?
Sì — il testo completo di «Autenticazione: API key e OAuth» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.
Cosa imparerò in «Autenticazione: API key e OAuth»?
Bearer token, header con API key e flussi OAuth2 per l’accesso degli agenti alle API Eserciti AI Agents con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Agents?
Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Autenticazione: API key e OAuth»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Agents?
Sì. Ogni lezione AI Agents include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Fondamenti delle REST API per sviluppatori di agenti
- Autenticazione: API key e OAuth
- Gestione delle risposte e degli errori delle API
- Rate limiting e logica di retry