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é.
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.
je ne sais pas pourquoi mais ça marche avec le service httpbin.-Credential
paramètre 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 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.
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"
Cette version fonctionne avec Get-Credential
PSCredential
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)} ...
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.