Utiliser Invoke-WebRequest avec un nom d’utilisateur et un mot de passe pour l’authentification de base sur l’API GitHub

Question initiale

Avec cURL, nous pouvons transmettre un nom d’utilisateur avec une requête Web HTTP comme suit:

$ curl -u  https://api.github.com/user 

L’indicateur -u accepte un nom d’utilisateur pour l’authentification, puis cURL demandera le mot de passe. L’exemple cURL concerne l’ authentification de base avec GitHub Api .

Comment pouvons-nous également passer un nom d’utilisateur et un mot de passe avec Invoke-WebRequest? Le but ultime est d’utiliser PowerShell avec une authentification de base dans l’API GitHub.

Modifier (c’est ce qui a fonctionné)

Les notes proviennent de Wikipedia sur Basic Auth depuis le côté client .

Combinez le nom d’utilisateur et le mot de passe en un seul username:password

 $user = "shaunluttin" $pass = "super-strong-alpha-numeric-symbolic-long-password" $pair = "${user}:${pass}" 

Encodez la chaîne à la variante RFC2045-MIME de Base64, sauf pas limitée à 76 caractères / ligne.

 $bytes = [System.Text.Encoding]::ASCII.GetBytes($pair) $base64 = [System.Convert]::ToBase64Ssortingng($bytes) 

Créez la valeur Auth comme méthode, espace, puis la paire codée. Method Base64Ssortingng

 $basicAuthValue = "Basic $base64" 

Créez l’en-tête Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

 $headers = @{ Authorization = $basicAuthValue } 

Invoquer la demande Web

 Invoke-WebRequest -uri "https://api.github.com/user" -Headers $headers 

Merci à @Briantist pour l’aide!

Discussion

La version de PowerShell est plus détaillée que la version de cURL. Pourquoi donc? @Briantist a fait remarquer que GitHub brise la RFC et que PowerShell s’y tient. Est-ce que cela signifie que cURL rompt également avec la norme?

Je suppose que l’authentification de base ici.

 $cred = Get-Credential Invoke-WebRequest -Uri 'https://whatever' -Credential $cred 

Vous pouvez obtenir vos informations d’identification par d’autres moyens ( Import-Clixml , etc.), mais il doit s’agir d’un object [PSCredential] .

Modifier en fonction des commentaires:

GitHub brise RFC comme ils l’expliquent dans le lien fourni :

L’API prend en charge l’authentification de base telle que définie dans la RFC2617 avec quelques légères différences. La principale différence réside dans le fait que la RFC requirejs des réponses non authentifiées avec 401 réponses non autorisées. Dans de nombreux endroits, cela révélerait l’existence de données utilisateur. Au lieu de cela, l’API GitHub répond avec 404 introuvable. Cela peut entraîner des problèmes pour les bibliothèques HTTP qui supposent une réponse 401 non autorisée. La solution consiste à créer manuellement l’en-tête d’autorisation.

Invoke-WebRequest ma connaissance, Invoke-WebRequest de Powershell attend une réponse 401 avant d’envoyer les informations d’identification, et comme GitHub n’en fournit jamais, vos informations d’identification ne seront jamais envoyées.

Construire manuellement les en-têtes

Au lieu de cela, vous devrez créer les en-têtes d’authentification de base vous-même.

L’authentification de base prend une chaîne composée du nom d’utilisateur et du mot de passe séparés par un deux-points user:pass , puis envoie le résultat codé en Base64.

Code comme ceci devrait fonctionner:

 $user = 'user' $pass = 'pass' $pair = "$($user):$($pass)" $encodedCreds = [System.Convert]::ToBase64Ssortingng([System.Text.Encoding]::ASCII.GetBytes($pair)) $basicAuthValue = "Basic $encodedCreds" $Headers = @{ Authorization = $basicAuthValue } Invoke-WebRequest -Uri 'https://whatever' -Headers $Headers 

Vous pouvez combiner une partie de la concaténation de chaîne mais je voulais la décomposer pour la rendre plus claire.

Utilisez ceci:

 $root = 'REST_SERVICE_URL' $user = "user" $pass= "password" $secpasswd = ConvertTo-SecureSsortingng $pass -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd) $result = Invoke-RestMethod $root -Credential $credential 

Invoke-WebRequest suit la RFC2617 comme @briantist a noté, cependant, certains systèmes (par exemple, JFrog Artifactory) autorisent l’utilisation anonyme si l’en-tête Authorization est absent, mais répondront avec 401 Forbidden si l’en-tête contient des informations d’identification non valides.

Cela peut être utilisé pour déclencher la réponse 401 Forbidden et obtenir des éléments -Credentials pour fonctionner.

 $login = Get-Credential -Message "Enter Credentials for Artifactory" #Basic foo:bar $headers = @{ Authorization = "Basic Zm9vOmJhcg==" } Invoke-WebRequest -Credential $login -Headers $headers -Uri "..." 

Cela enverra l’en-tête non valide la première fois, qui sera remplacé par les informations d’identification valides dans la deuxième demande, car -Credentials remplace l’en-tête d’ Authorization .

Testé avec Powershell 5.1