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

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


Source : Stack Overflow [powershell]

Je suppose ici une authentification basique.

`$cred = Get-Credential
Invoke-WebRequest -Uri ‘https://whatever’ -Credential $cred


Vous pouvez obtenir vos identifiants par d'autres moyens (`Import-Clixml`, etc.), mais il doit s'agir d'un objet `[PSCredential]`.

Modification basée sur les commentaires :

GitHub ne respecte pas le RFC comme ils l'expliquent dans le [lien que vous avez fourni](https://developer.github.com/v3/auth/) :


L'API prend en charge l'authentification basique telle que définie dans le RFC2617 avec quelques
  légères différences. La principale différence est que le RFC exige
  que les requêtes non authentifiées reçoivent des réponses 401 Unauthorized.
  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 Not Found. Cela peut
  poser des problèmes pour les bibliothèques HTTP qui s'attendent à une réponse
  401 Unauthorized. La solution est de construire manuellement l'en-tête Authorization.

Le cmdlet `Invoke-WebRequest` de Powershell, à ma connaissance, attend une réponse 401 avant d'envoyer les identifiants, et puisque GitHub n'en fournit jamais, vos identifiants ne seront jamais envoyés.

Construire les en-têtes manuellement

À la place, vous devrez créer vous-même les en-têtes d'authentification basique.

L'authentification basique prend une chaîne composée du nom d'utilisateur et du mot de passe séparés par deux-points `user:pass` puis envoie le résultat encodé en Base64.

Un code comme celui-ci devrait fonctionner :

`$user = 'user'
$pass = 'pass'

$pair = "$($user):$($pass)"

$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))

$basicAuthValue = "Basic $encodedCreds"

$Headers = @{
    Authorization = $basicAuthValue
}

Invoke-WebRequest -Uri 'https://whatever' -Headers $Headers

Vous pourriez combiner certaines concaténations de chaînes mais j’ai voulu les détailler pour plus de clarté.