1

Je rencontre des problèmes lors de l'utilisation de l'authentification de base dans WWW::Mechanize. Je suis en train de se connecter au Streak API, la documentation qui stipule:Définition des informations d'authentification de base dans WWW :: Mechanize

Streak utilise HTTP Basic Auth pour signer chaque demande avec votre clé API. Il suffit de définir le nom d'utilisateur de la requête sur la clé API. Le champ de mot de passe est ignoré. Toutes les demandes doivent être effectuées via HTTPS car les requêtes HTTP seront ignorées.

Voici une demande d'échantillon:

curl https://www.streak.com/api/v1/pipelines -u YOUR_API_KEY:

je peux accéder avec succès l'API à l'aide curl de cette façon. Cependant, je ne parviens pas à m'authentifier avec succès en utilisant WWW :: Mechanize. Voici ce que j'ai:

#!perl 

use warnings; 
use strict; 
use feature 'say'; 

use WWW::Mechanize; 

my $api = 'https://www.streak.com/api/v1/'; 

my $mech = WWW::Mechanize->new(autocheck => 0); # don't die on errors 

$mech->credentials('my API key here', ''); 

$mech->get($api . 'pipelines'); 

say $mech->response->status_line; 
say $mech->res->request->as_string; 

me exécution de ce Code devient:

401 Unauthorized 
GET https://www.streak.com/api/v1/pipelines 
Accept-Encoding: gzip 
User-Agent: WWW-Mechanize/1.83 

L'authentification est même pas tentée. Quelqu'un peut-il suggérer pourquoi cela pourrait être le cas, et ce que je pourrais faire pour le réparer? Ce code est en cours d'exécution dans Strawberry Perl 5.24.0.1, si cela peut avoir quelque chose à voir avec cela.

[Edité pour inclure la suggestion de simbabque d'examiner objet de requête.]

+0

Avez-vous comparé l'objet HTTP :: Request que WWW :: Mechanize crée avec la requête curl? Vous pouvez utiliser '$ mech-> res-> request-> as_string' pour obtenir le côté Perl des choses, et' curl -v' pour curl. – simbabque

+0

Intéressant. Cela révèle qu'il ne fait pas l'authentification du tout: 'GET https: // www.streak.com/api/v1/pipelines' ' Accepter-Encodage: gzip' 'Utilisateur-Agent: WWW-Mechanize/1.83 ' –

+0

J'ai vu la même chose. Très étrange. Si vous fournissez une chaîne plus longue, elle ne le fait pas non plus. Mais j'ai du code qui utilise cette fonctionnalité. Nous négligeons quelque chose que je crois. – simbabque

Répondre

1

Je trouve le problème.

En suivant la technique dans this post on Perl Maven ("Comment trouver l'URL et le domaine?"), Il s'avère que l'API n'envoie pas de challenge pour les informations d'identification, en spécifiant un domaine, lorsque vous essayez de vous connecter. Il vous donne juste un message d'erreur indiquant que l'authentification de base est requise. LWP :: UserAgent ne sait pas faire autre chose à ce moment-là.

Alors, je copiais l'en-tête d'authentification de la demande de boucle réussie qui simbabque a suggéré d'examiner et régler manuellement que sur l'objet de l'agent utilisateur:

$ua->default_header('Authorization' => 'Basic [Base64-encoded string here]'); 

Maintenant, il fonctionne. Moments heureux.

+0

félicitations pour comprendre cela et l'afficher ici. – xxfelixxx

+0

Hey, merci @xxfelixxx. Espérons que cela sera utile à toute autre personne utilisant WWW :: Mechanize et rencontrant une ressource qui ne fait pas l'authentification correctement. Comme il se trouve, cette API est en violation [RFC 7235 (Hypertext Transfer Protocol (HTTP/1.1): Authentification) section 3.1.] (Https://tools.ietf.org/html/rfc7235#section-3.1) en n'accompagnant pas le 401 non autorisé avec un en-tête WWW-Authenticate. –