0
votes

Demandes python 401 non autorisées

J'essaie de vous connecter à un site Web basé sur le serveur Cloudflare. J'ai contourné les problèmes de connexion à l'aide de CloudServer, mais mon prochain point d'arrêt a été quand j'ai essayé d'envoyer une demande d'obtention d'avoir accès à des jetons de connexion post-login.

My Code: P>

{'Date': 'Wed, 17 Jun 2020 23:58:42 GMT', 'Content-Type': 'text/html; charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'CF-Ray': '5a50b85dd8fdd665-MAD', 'Strict-Transport-Security': 'max-age=15552000; includeSubDomains; preload', 'WWW-Authenticate': 'Basic realm="weblogic"', 'CF-Cache-Status': 'DYNAMIC', 'cf-request-id': '0366518ea80000d66506a1b200000001', 'Expect-CT': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'X-Content-Type-Options': 'nosniff', 'Set-Cookie': '__cf_bm=c153a7277cf7abbaa004cdb46da821906f04b7c6-1592438322-1800-AR+KhjkQM5NHTTqKA0scqXrUGJpKNOnG0ZASOG386zEILi28YAh28BV+pWYGXzly+7ptsr9TJSGurY2nBOTv75I=; path=/; expires=Thu, 18-Jun-20 00:28:42 GMT; domain=.paf.es; HttpOnly; Secure; SameSite=None', 'Vary': 'Accept-Encoding', 'Server': 'cloudflare', 'alt-svc': 'h3-27=":443"; ma=86400'}


5 commentaires

Pourquoi n'utiliser pas les requêtes.get à la place?


Je ne comprends pas, au lieu de ce que


Utilisez Demandes Lib, vous pouvez télécharger Google Python Demandes lib pour usage


CloudServer est une bibliothèque basée sur les demandes. Il est utilisé pour contourner 403 que Cloudflare donne aux demandes. Si vous utilisez une demande régulière pour cette question, vous obtenez toujours 401


Avez-vous essayé d'exécuter votre demande d'obtenir dans Postman? Le problème ressemble à celui-ci aux en-têtes (comme l'achèvement sur le code Python). Aussi dans vous des en-têtes, vous avez une authentification, mais je pense que le mot correct est l'autorisation E.g: "Autorisation": "Basic ABCDE"


3 Réponses :


0
votes

Je ne suis pas sûr à 100% de quelle bibliothèque que vous utilisez ici, mais en supposant que la bibliothèque est basée sur des demandes, la façon dont je lis cela est la suivante:

Vous essayez d'envoyer une demande au serveur, qui échoue avec une erreur 401. Cela signifie que votre demande manquait des informations d'identification nécessaires pour accéder à ce que vous essayez d'accéder.

Vous envoyez donc une autre demande avec un nom d'utilisateur et un mot de passe.

Le serveur répond avec une autre erreur 401 , qui signifie toujours la même chose: votre demande manquait des informations d'identification nécessaires pour accéder à ce que vous essayez d'accéder.

Compte tenu de l'en-tête de réponse fourni par le serveur: 'www-authentifier': ' Basic RealM = "Weblogic" ', vous devez être correct que vous devez utiliser une authentification de base.

Le Weblogic RealM est la zone que le serveur indique que vous devez vous connecter. Votre demande doit avoir un nom d'utilisateur et un mot de passe valides pour ce domaine sur ce serveur.

Ensumant à nouveau que votre bibliothèque est basée sur des demandes, vous n'avez pas besoin de baser vous-même vous-même, cet appel: xxx

ou cette version sténographie: xxx

vous gérera pour vous, mais vous avez besoin d'une combinaison nom d'utilisateur et mot de passe valide.


1 commentaires

Oui, les cloudscraper sont basées sur des demandes. C'est comme des demandes. J'ai déjà fait ce que vous avez suggéré, mais le 401 prévaut toujours. Ce qui a quelque peu travaillé est, provit que le s = cloudscrsper.create_scraper () est une session de demande, réutiliser les en-têtes de la connexion au lieu d'ajouter dans la demande S.get. Le problème est que cela fonctionne parfois, parfois encore 401, et je ne sais pas pourquoi est-ce



0
votes

OK, alors quelque chose que j'ai essayé semble avoir travaillé partiellement. Juste pour récapituler, j'ai tout essayé:

Ajout Autorisation: Basic aux en-têtes de la demande

Ajout Autorisation: porteur aux en-têtes de la demande

à l'aide de auth = httpbasicauth (nom d'utilisateur, mot de passe) dans la demande

à l'aide de auth = httpdigestauth (nom d'utilisateur , mot de passe) dans la demande

Rien ne semblait fonctionner. Juste comme un rappel, j'utilise des cloudscraper au lieu d'une demande régulière, car le serveur est dans Cloudflare et a été renvoyé autrement 403.

Donc, ce qui a effectivement fonctionné, c'était de réutiliser les en-têtes utilisés dans la tentative de connexion. Donc au lieu de ce xxx

j'ai fait ceci xxx

Ce n'est pas parfait, comme parfois cela fonctionne, et parfois Pour aucune raison et affichant les mêmes paramètres dans le même ordre. Mais, c'est une progression


0 commentaires

2
votes

Juste au cas où l'authentification HTTP n'est pas clairement comprise ici, je vais expliquer comment cela fonctionne.

  1. Vous demandez une ressource HTTP de manière habituelle, avec tous les en-têtes, vous pensez avoir besoin

  2. Si le contenu ou la zone (c'est-à-dire REALM) est protégé par mot de passe, le serveur renvoie 401 erreur. La réponse contient l'en-tête www-authentifier qui vous indique quelle méthode d'authentification à utiliser lors de la réponse au serveur et à ce que cela s'applique.

  3. Si vous recevez le 401, vous répétez votre demande au serveur, mais vous ajoutez l'en-tête d'autorisation à la demande. Son contenu varie en fonction de la méthode utilisée, c'est-à-dire que celle-ci étant demandée par le serveur dans la première réponse. Pour la méthode d'authentification de base, votre autorisation doit avoir le mot de base en tant que premier "argument", puis le nom d'utilisateur et le mot de passe séparé à l'aide de la signature du côlon ":", mais cette chaîne doit être codée de base64. Vous pouvez faire:

    en-têtes ["Autorisation"] = "BASIC" + ((("% s:% S"% (nom d'utilisateur, mot de passe)). Encodé ("base64")

    Ceci est conçu pour prendre en charge les navigateurs et les dialogues d'interface graphique. Lorsqu'un navigateur reçoit 401, il apparaît une boîte de dialogue vous demandant un nom d'utilisateur et un mot de passe. Lorsque vous cliquez sur OK, il répète la demande avec l'en-tête d'autorisation ajoutée à celui-ci. À partir de ce point, le navigateur envoie toujours l'en-tête d'autorisation pour continuer à être connecté, jusqu'à ce qu'un autre 401 soit reçu pour un autre domaine. Le royaume est utilisé de sorte que le navigateur puisse modifier les informations d'identification automatiquement Doring de la session en fonction du serveur RealM, sans vous demander de les saisir à nouveau chaque fois que le même domaine est demandé. C'est parce que vous pouvez avoir des zones différentes de fichiers protégés avec différents mots de passe ou plusieurs comptes sur le même serveur, etc.

    Maintenant, pour des raisons de sécurité et de normalisation, un serveur peut toujours refuser une première demande, peu importe si Il reçoit déjà l'en-tête d'autorisation. En fait, cela peut le voir comme une violation de la sécurité si vous envoyez l'autorisation avant que l'authentification www n'ait pas été demandée. Certains serveurs l'ont envoyé une fois et s'attend à ce que l'autorisation soit présente à partir de ce point et ne répétez que 401 si elle disparaît des demandes supplémentaires d'un client. L'autre enverra toujours 401 puis attendez-vous à la demande répétée. Certains vont également couper votre accès complètement et vous recevrez le 403 interdit si vous envoyez les informations d'identification incorrectes. 3 fois de suite. De plus, si le serveur utilise l'authentification de base, cela signifie généralement que le serveur utilise HTTPS, et non http. Comme les données envoyées sont faciles à intercepter et à lire sur un lien HTTP, si HTTP est utilisé, une autre méthode cryptée et cryptée sera invitée à préserver la sécurité. Donc, le serveur peut également vous refuser si vous envoyez une en-tête d'autorisation avec une méthode de base via le HTTP au lieu de https.

    La fonctionnalité du serveur que j'ai décrit ci-dessus (procédure d'authentification standard HTTP) est la raison pour laquelle vous obtenez parfois et parfois, vous recevez 401 à nouveau. La méthode que vous traitez est de ne jamais envoyer d'en-tête d'autorisation à moins que vous ne receviez d'abord 401. Utiliser Urllib pour faire face à cela est facile car un HTTPerror () sera soulevé pour le 401 non autorisé. Donc, vous voudriez simplement: xxx

    Vous devez voir si le serveur envoie 401 chaque fois ou une seule fois. Comme vous utilisez des demandes, vous devrez vérifier un code de réponse à l'aide de l'attribut Réponses sans essayer, sauf le blocage. Ou basculer sur stdlib urllib / urllib2. C'est ce que je ferais ce que je ferais comme il semble que vous n'utilisez pas de fonctionnalités des demandes telles que des sessions, mais envoyez des cookies à chaque fois manuellement.

    La vraie question ici est ce qu'on attend de JSON et à quoi d'en-têtes HTTP . Sont tous deux nécessaires ou un seul d'entre eux. Vous devrez juste avoir à expérimenter. Cela me semble que l'API effectue l'authentification HTTP, même si vous n'envoyez que des informations d'identification via des données. Mais ...


0 commentaires