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.
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!
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]
.
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.
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