Python >> Tutoriel Python >  >> Python Tag >> Requests

Requêtes Python :requête POST supprimant l'en-tête d'autorisation

TLDR

L'URL que vous demandez redirige les requêtes POST vers un autre hôte, de sorte que la bibliothèque de requêtes supprime le Authoriztion en-tête de peur de divulguer vos informations d'identification. Pour résoudre ce problème, vous pouvez remplacer la méthode responsable dans les requêtes Session classe.

Détails

Dans les requêtes 2.4.3, le seul endroit où reqeuests supprime le Authorization header est lorsqu'une requête est redirigée vers un autre hôte. Voici le code correspondant :

if 'Authorization' in headers:
    # If we get redirected to a new host, we should strip out any
    # authentication headers.
    original_parsed = urlparse(response.request.url)
    redirect_parsed = urlparse(url)

    if (original_parsed.hostname != redirect_parsed.hostname):
        del headers['Authorization']

Dans les nouvelles versions de requests , le Authorization l'en-tête sera supprimé dans des cas supplémentaires (par exemple si la redirection provient d'un protocole sécurisé vers un protocole non sécurisé).

Donc, ce qui se passe probablement dans votre cas, c'est que vos requêtes POST sont redirigées vers un autre hôte. La seule façon de fournir une authentification pour un hôte redirigé à l'aide de la bibliothèque de requêtes est via un .netrc dossier. Malheureusement, cela ne vous permettra que d'utiliser HTTP Basic Auth, ce qui ne vous aide pas beaucoup. Dans ce cas, la meilleure solution est probablement de sous-classer requests.Session et remplacez ce comportement, comme ceci :

from requests import Session

class NoRebuildAuthSession(Session):
    def rebuild_auth(self, prepared_request, response):
        """
        No code here means requests will always preserve the Authorization
        header when redirected.
        Be careful not to leak your credentials to untrusted hosts!
        """

session = NoRebuildAuthSession()
response = session.post('https://myserver.com/endpoint', headers=headers, data=data)

Modifier

J'ai ouvert une pull-request à la bibliothèque de requêtes sur github pour ajouter un avertissement lorsque cela se produit. Il attend une deuxième approbation pour fusionner (déjà trois mois).