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.
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.
Je ne sais pas pourquoi le paramètre mais cela fonctionne avec le httpbin service .-Credential
Ne fonctionne pas dans votre cas,
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.
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"
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.
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)} ...
#Requires -Version 6
$Uri = 'https://httpbin.org/basic-auth/user/pass'
$Credential = Get-Credential
Invoke-RestMethod -Uri $Uri -Authentication Basic -Credential $Credential
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.