L'équivalent Invoke-RestMethod de curl-u (Basic Authentication) de PowerShell)

Quel est l'équivalent de

curl -u username:password ...

dans PowerShell Invoke-RestMethod? J'ai essayé ceci:

$securePwd = ConvertTo-SecureString "password" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($username, $securePwd)

Invoke-RestMethod -Credential $credential ...

mais il retourne 401, non autorisé.

35
demandé sur Borek Bernard 2014-07-10 13:19:13

5 réponses

C'est la seule méthode qui a fonctionné pour moi jusqu'à présent:

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))

Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ...

mais je ne crois pas qu'il n'y ait pas de meilleur moyen.

64
répondu Borek Bernard 2014-07-10 09:37:45

je ne sais pas pourquoi -Credential paramètre ne fonctionne pas dans votre cas, mais ça marche avec le service httpbin.

Vous pouvez essayer ceci:

$pwd = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
$cred = New-Object Management.Automation.PSCredential ('PsUser', $pwd)

Invoke-RestMethod 'http://httpbin.org/basic-auth/PsUser/MyPassword' -cred $cred

Edit: comme indiqué dans les commentaires, cette méthode n'enverra pas l'en-tête D'autorisation sur la demande initiale. Il attend une réponse de contestation puis renvoie la requête avec l'en-tête D'autorisation. Cela ne fonctionnera pas pour les services qui exigent des justificatifs d'identité sur la demande.

11
répondu Rynant 2014-07-10 21:15:04

il semble que vous devriez combiner des méthodes quand elles échouent indépendamment.

créer le justificatif et l'ajouter à la demande.

Créez l'en-tête et l'ajouter à la demande.

$username = "username";
$password = ConvertTo-SecureString –String "password" –AsPlainText -Force
$credential = New-Object –TypeName "System.Management.Automation.PSCredential" –ArgumentList $username, $password

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))

$getProjectUri = "yourUri"
Invoke-RestMethod -Method Get -Uri $getProjectUri -Headers @{Authorization = "Basic $base64AuthInfo" } -Credential $credential -ContentType "application/json"
5
répondu Montané Hamilton 2016-08-31 17:06:34

Cette version fonctionne avec Get-CredentialPSCredential objet. Il fonctionne également multiplateformes dans PowerShell 6.0. Pour ce faire, il évite d'utiliser les appels BSTR, qui sont parfois suggérés lorsqu'on tente d'extraire le mot de passe de PSCredential.

$creds = Get-Credential
$unsecureCreds = $creds.GetNetworkCredential()
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $unsecureCreds.UserName,$unsecureCreds.Password)))
Remove-Variable unsecureCreds

Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ...
2
répondu Jason Ritchie 2017-09-19 17:12:18

j'ai trouvé que l'utilisation de l' -WebSession le paramètre fonctionne, si vous pré-créez un objet WebRequestSession avec des identifiants. Je ne vais pas ressasser comment créer un objet de justificatifs PS, car cela a déjà été couvert dans d'autres réponses.

$WebSession = New-Object -TypeName Microsoft.PowerShell.Commands.WebRequestSession -Property @{Credentials=$Credential}
Invoke-RestMethod -Uri "your_URI" -WebSession $WebSession

cette approche envoie l'en-tête auth au premier appel, donc évite la réponse 401.

soit dit en passant, cette approche peut également être utilisée pour définir les détails de proxy (qui ne fonctionnent pas correctement dans toutes les versions de PS lorsqu'ils sont spécifiés en utilisant le paramètres), et gère les cookies si votre API l'exige.

2
répondu paulf 2018-07-03 00:01:53