Perché il mio codice Python con API REST dà errore 401 anche con token valido?

👤 Iniziato da @matias.276
📅 25/02/2026 05:00
📁 Programmazione 🌐 IT
Avatar di matias.276
Ciao a tutti, sto provando a fare una chiamata a un'API REST usando Python 3.11 e la libreria requests, ma continuo a ricevere un errore 401 Unauthorized anche se sono sicuro che il token di autenticazione è corretto e valido. Ho già controllato che il token non sia scaduto e che venga passato nell'header Authorization come "Bearer <token>". Questo è il pezzo di codice che uso:

```python
import requests

url = "https://api.example.com/v1/data"
token = "mio_token_valido"
headers = {"Authorization": f"Bearer {token}"}

response = requests.get(url, headers=headers)
print(response.status_code)
print(response.text)
```

L'API richiede OAuth2 e ho seguito la documentazione ufficiale, ma senza successo. Qualcuno ha avuto esperienza con errori 401 in casi simili o sa cosa potrebbe causare questo problema? Forse sto sbagliando qualche dettaglio nell'header o nella configurazione della richiesta. Ogni suggerimento o esempio è ben accetto, grazie in anticipo!
Avatar di karmagatti77
@matias.276 ho avuto un problema simile l’anno scorso, e alla fine era la mancanza di un header `Accept: application/json` che l’API richiedeva obbligatoriamente. A volte la documentazione non lo specifica ma il server è inflessibile. Prova ad aggiungerlo ai headers, magari insieme a `Content-Type: application/json` anche se non mandi payload.

Un’altra cosa: hai verificato con uno strumento come Postman o curl che il token funziona davvero su quella specifica endpoint? A volte i token sono validi solo per certe risorse o richiedono scope aggiuntivi. Se sì, controlla che l’URL non abbia slash finali o parametri nascosti che la libreria aggiunge per default.

Se niente funziona, stampa anche gli header della response (`response.headers`) per vedere se ci sono indizi, tipo un `WWW-Authenticate` che suggerisce il formato atteso. Sono dettagli che fanno impazzire ma alla fine ti ringrazierai di aver controllato.
Avatar di bellinozanella24
@matias.276 il 401 con token valido capita spesso per dettagli subdoli. Prima cosa: hai verificato il token con curl o Postman sull’endpoint esatto? A volte i token sono validi solo per risorse specifiche o richiedono scope aggiuntivi non ovvi. Secondo: alcuni server OAuth2 richiedono l’header `Authorization` in minuscolo (`authorization`) per compatibilità, prova a modificare la chiave del dict in `"authorization"` invece di `"Authorization"`. Terzo: controlla se il token è un JWT e ha un campo `aud` (audience) che deve corrispondere all’URL dell’API. Se usi un token per `api.example.com` ma l’endpoint è `api2.example.com`, scatta il 401. Ultimo: stampa `response.headers` per vedere se c’è `WWW-Authenticate: Bearer error="invalid_token", error_description="The audience is invalid"` o simili. Se sì, il problema è nell’audience o nello scope. A volte la documentazione è troppo sintetica su questi dettagli.
Avatar di matias.276
Grande @bellinozanella24, grazie mille per il contributo super dettagliato! Hai ragione, proprio quei dettagli subdoli mi stanno facendo impazzire. Ho già fatto un paio di test con Postman sullo stesso endpoint e il token sembra funzionare lì, quindi magari il problema sta nel modo in cui passo l’header in Python. Proverò subito a cambiare `"Authorization"` in `"authorization"` come suggerisci, non ci avevo pensato! Per quanto riguarda l’audience, non avevo controllato il campo `aud` del JWT, mi hai dato una bella pista da seguire. Stamattina ho pure provato a leggere gli header di risposta ma non ho visto nulla di chiaro, forse devo fare una stampa più pulita. Ti aggiorno appena provo tutto, sembra che ci stiamo avvicinando alla soluzione! Se qualcuno ha altre idee folli tipo "e se il server fosse in realtà un robot alieno che vuole solo messaggi in codice Morse?" sono tutto orecchi 😉

La Tua Risposta

💬

Vuoi partecipare alla discussione?

Accedi o registrati per scrivere la tua risposta e unirti alla conversazione!