Avec cURL, nous pouvons passer un nom d'utilisateur avec une requête Web HTTP comme suit:
$ curl -u <your_username> https://api.github.com/user
L' -u
indicateur accepte un nom d'utilisateur pour l'authentification, puis cURL demandera le mot de passe. L'exemple cURL concerne l' authentification de base avec l'API GitHub .
Comment transmettre de la même manière un nom d'utilisateur et un mot de passe avec Invoke-WebRequest? L'objectif ultime est d'utiliser PowerShell avec l'authentification de base dans l'API GitHub.
powershell
github-api
basic-authentication
Shaun Luttin
la source
la source
$pair = "$($user):$($pass)"
Vérifiez la réponse approuvée. J'utilisais ce qui précède et cela m'a donné trop de douleur-Credential
approche ne fonctionne car l'en-tête d'authentification correct n'est pas généré lorsque la demande est effectuée.Réponses:
J'assume ici l'authentification de base.
Vous pouvez obtenir vos informations d'identification par d'autres moyens (
Import-Clixml
, etc.), mais il doit s'agir d'un[PSCredential]
objet.Modifier en fonction des commentaires:
GitHub rompt la RFC comme ils l'expliquent dans le lien que vous avez fourni :
À
Invoke-WebRequest
ma connaissance, Powershell attend une réponse 401 avant d'envoyer les informations d'identification, et comme GitHub n'en fournit jamais une, vos informations d'identification ne seront jamais envoyées.Construire manuellement les en-têtes
Au lieu de cela, vous devrez créer vous-même les en-têtes d'authentification de base.
L'authentification de base prend une chaîne composée du nom d'utilisateur et du mot de passe séparés par deux
user:pass
- points , puis envoie le résultat encodé en Base64.Un code comme celui-ci devrait fonctionner:
Vous pouvez combiner une partie de la concaténation de chaînes, mais je voulais la casser pour la rendre plus claire.
la source
Utilisez ceci:
la source
J'ai dû faire ceci pour que ça marche:
la source
Invoke-WebRequest
suit la RFC2617 comme @briantist l'a noté, cependant il existe certains systèmes (par exemple JFrog Artifactory) qui permettent une utilisation anonyme si l'en-Authorization
tête est absent, mais qui répondront401 Forbidden
si l'en-tête contient des informations d'identification invalides.Cela peut être utilisé pour déclencher la
401 Forbidden
réponse et se mettre-Credentials
au travail.Cela enverra l'en-tête invalide la première fois, qui sera remplacé par les informations d'identification valides dans la deuxième demande car il
-Credentials
remplace l'en-Authorization
tête.Testé avec Powershell 5.1
la source
Si quelqu'un avait besoin d'une seule doublure:
la source
une autre façon est d'utiliser certutil.exe, enregistrez votre nom d'utilisateur et votre mot de passe dans un fichier par exemple in.txt comme nom d'utilisateur: mot de passe
Vous devriez maintenant pouvoir utiliser la valeur d'authentification de out.txt
la source
Je sais que c'est un peu en dehors de la demande originale des OP, mais je suis tombé sur cela en cherchant un moyen d'utiliser Invoke-WebRequest contre un site nécessitant une authentification de base.
La différence est que je ne voulais pas enregistrer le mot de passe dans le script. Au lieu de cela, je voulais demander au script runner les informations d'identification du site.
Voici comment je l'ai géré
Le résultat est que le script runner est invité avec une boîte de dialogue de connexion pour l'U / P, puis Invoke-WebRequest est capable d'accéder au site avec ces informations d'identification. Cela fonctionne car $ Creds.Password est déjà une chaîne chiffrée.
J'espère que cela aidera quelqu'un à la recherche d'une solution similaire à la question ci-dessus mais sans enregistrer le nom d'utilisateur ou le PW dans le script
la source
C'est ce qui a fonctionné pour notre situation particulière.
Les notes proviennent de Wikipedia sur l'authentification de base du côté client . Merci à la réponse de @ briantist pour l'aide!
Combinez le nom d'utilisateur et le mot de passe en une seule chaîne
username:password
Encodez la chaîne dans la variante RFC2045-MIME de Base64, sauf si elle n'est pas limitée à 76 caractères / ligne.
Créez la valeur Auth comme méthode, un espace, puis la paire encodée
Method Base64String
Créer l'en-tête
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Appeler la requête Web
La version PowerShell de ceci est plus détaillée que la version cURL. Pourquoi donc? @briantist a souligné que GitHub rompt la RFC et que PowerShell s'y tient. Cela signifie-t-il que cURL rompt également avec la norme?
la source