web-dev-qa-db-fra.com

Equivalent Invoke-RestMethod de PowerShell de curl -u (authentification de base)

Quel est l'équivalent de

curl -u username:password ...

dans PowerShell's 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, Unauthorized.

52
Borek Bernard

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.

90
Borek Bernard

Je ne sais pas pourquoi le paramètre -Credential Ne fonctionne pas dans votre cas, mais cela fonctionne avec le httpbin service .

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 Authorization lors de la demande initiale. Il attend une réponse à une question, puis renvoie la demande avec l'en-tête Authorization. Cela ne fonctionnera pas pour les services nécessitant des informations d'identification lors de la demande initiale.

14
Rynant

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

Créez les informations d'identification et ajoutez-les à la demande.

Créez l'en-tête et ajoutez-le à 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"
8
Montané Hamilton

J'ai constaté que l'utilisation du paramètre -WebSession Fonctionnait si vous pré-créez un objet WebRequestSession avec des informations d'identification. Je ne reviendrai pas sur la création d'un objet Credential 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 d'authentification lors du premier appel, évitant ainsi la réponse 401.

Incidemment, cette approche peut également être utilisée pour définir les détails du proxy (qui ne fonctionnent pas correctement dans toutes les versions de PS lorsque spécifié à l'aide des paramètres), et gère les cookies si votre API le requiert.

3
paulf

Cette version fonctionne avec Get-Credential _ objet PSCredential. Cela fonctionne également sur plusieurs plates-formes dans PowerShell 6.0. Pour ce faire, il évite d’utiliser des 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
Jason Ritchie
#Requires -Version 6
$Uri = 'https://httpbin.org/basic-auth/user/pass'
$Credential = Get-Credential
Invoke-RestMethod -Uri $Uri -Authentication Basic -Credential $Credential
0
Jaqueline Vanek

Vous devez en principe passer la paire nom d'utilisateur/mot de passe à Invoke-RestMethod en tant que variable d’identification codée.

Ce qui a fonctionné pour moi a été le suivant:

$USERNAME = 'user'
$PASSWORD = 'password'
$IDP_URL = 'example.com/token'


$credPair = "$($USERNAME):$($PASSWORD)"
$encodedCredentials = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($credPair))

$parameters = @{
    Uri         = $IDP_URL
    Headers     = @{ 'Authorization' = "Basic $encodedCredentials" }
    Method      = 'POST'
    Body        = '...'
    ContentType = '...'
}

Invoke-RestMethod @parameters

Notez comment vous pouvez extraire les paramètres de requête dans $parameters pour éviter de gonfler votre commande.

0