2014-07-10 10 views
32

Was ist das Äquivalent vonPowershell Invoke-RestMethod Äquivalent curl -u (Basic Authentication)

curl -u username:password ... 

in Powershell Invoke-RestMethod? Ich habe das versucht:

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

Invoke-RestMethod -Credential $credential ... 

aber es gibt 401, nicht autorisiert.

Antwort

59

Dies ist die einzige Methode, die bisher für mich gearbeitet:

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

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

Aber ich glaube nicht, dass es keinen besseren Weg gibt.

9

Ich bin mir nicht sicher, warum die -Credential Parameter in Ihrem Fall nicht funktionieren, aber es funktioniert mit den httpbin service.

Sie können dies versuchen:

$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: Wie in den Kommentaren erwähnt, wird diese Methode nicht den Authorization-Header auf die anfängliche Anforderung senden. Es wartet auf eine Challenge-Antwort und sendet die Anfrage erneut mit dem Autorisierungsheader. Dies funktioniert nicht für Dienste, für die bei der ersten Anforderung Anmeldeinformationen erforderlich sind.

+0

Wie unterscheidet sich das Snippet in der Frage? – Borek

+0

Ich bestätigte, dass es für die Standardauthentifizierung funktioniert, und stellte eine URL zur Verfügung, um es zu testen. Ich möchte nicht, dass Benutzer zu dieser Frage kommen, wenn sie nach der Verwendung von Basic Auth suchen und gesagt wird, dass '-Credential' nicht funktioniert. In dem von mir bereitgestellten Beispiel wird dies deutlich. Es muss etwas in deiner Situation geben, dass es bricht. – Rynant

+0

Ah Entschuldigung, ich habe verpasst, dass Sie vorschlagen, gegen eine bestimmte URL zu testen. In meinem Fall funktioniert curl und meine "manuelle" Methode zur Bereitstellung des Authorization HTTP-Headers funktioniert auch, es ist nur der Credential-Parameter, der das nicht tut. Weißt du nicht, was es intern macht? Fügt es einfach den gleichen HTTP-Header hinzu? – Borek

5

Es scheint, Sie sollten Methoden kombinieren, wenn sie unabhängig scheitern.

den Berechtigungsnachweis erstellen und sie auf die Anfrage hinzuzufügen.

die Header erstellen und sie auf die Anfrage hinzuzufügen.

$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" 
+0

sollte?Ich fühle, dass hier ein Zitat fehlt –

+1

Nicht sicher, wie man damit umgeht, sollte ich sagen, weil in Fällen, in denen einige Implementierungen scheinen beide Anmeldeinformationen auf die erste Anfrage wie Borek und @Rynant gefunden haben. Je nachdem, welcher Server aufgerufen wird, müssen Sie die Methoden möglicherweise kombinieren. –

+1

Bestätigen, dass das Kombinieren gelöschter Download-Artefakte von VSO ist. Thnx. –

1

Diese Version funktioniert mit Get-Credential ‚s PSCredential Objekt. Es funktioniert auch plattformübergreifend in PowerShell 6.0. Dies wird dadurch erreicht, dass die Verwendung von BSTR-Aufrufen vermieden wird, die manchmal vorgeschlagen werden, wenn versucht wird, das Kennwort von PSCredential zu extrahieren.

$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)} ...