it-swarm.com.de

Verwenden Sie Invoke-WebRequest mit einem Benutzernamen und einem Kennwort für die Standardauthentifizierung der GitHub-API

Erste Frage

Mit cURL können wir einen Benutzernamen mit einer HTTP-Webanforderung wie folgt übergeben: 

$ curl -u <your_username> https://api.github.com/user

Das -u-Flag akzeptiert einen Benutzernamen zur Authentifizierung, und cURL fordert dann das Kennwort an. Das cURL-Beispiel ist für die Authentifizierung mit Basic mit der GitHub-API .

Wie geben wir einen Benutzernamen und ein Passwort zusammen mit Invoke-WebRequest weiter? Das ultimative Ziel besteht darin, PowerShell mit der Standardauthentifizierung in der GitHub-API zu verwenden.

Bearbeiten (Dies hat funktioniert)

Anmerkungen stammen aus Wikipedia auf Basic Auth von der Clientseite .

Kombinieren Sie den Benutzernamen und das Kennwort in einer einzigen Zeichenfolge. username:password

$user = "shaunluttin"
$pass = "super-strong-alpha-numeric-symbolic-long-password"
$pair = "${user}:${pass}"

Kodieren Sie den String in die RFC2045-MIME-Variante von Base64, außer auf 76 Zeichen/Zeile.

$bytes = [System.Text.Encoding]::ASCII.GetBytes($pair)
$base64 = [System.Convert]::ToBase64String($bytes)

Erstellen Sie den Auth-Wert als Methode, ein Leerzeichen und dann das codierte Paar Method Base64String

$basicAuthValue = "Basic $base64"

Erstellen Sie den Header Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

$headers = @{ Authorization = $basicAuthValue }

Rufen Sie die Webanfrage auf

Invoke-WebRequest -uri "https://api.github.com/user" -Headers $headers

Vielen Dank an @briantist für die Hilfe!

Diskussion

Die PowerShell-Version davon ist ausführlicher als die cURL-Version. Warum das? @briantist wies darauf hin, dass GitHub den RFC bricht und PowerShell dabei bleibt. Bedeutet das, dass auch cURL mit dem Standard bricht?

86
Shaun Luttin

Ich gehe hier von einer Standardauthentifizierung aus.

$cred = Get-Credential
Invoke-WebRequest -Uri 'https://whatever' -Credential $cred

Sie können Ihren Berechtigungsnachweis auf andere Weise abrufen (Import-Clixml usw.), es muss jedoch ein [PSCredential]-Objekt sein.

Bearbeiten basierend auf Kommentaren:

GitHub bricht RFC, wie sie in dem von Ihnen angegebenen link erklären :

Die API unterstützt die Basisauthentifizierung, wie in RFC2617 definiert, mit einigen leichte Unterschiede. Der Hauptunterschied besteht darin, dass der RFC .__ erfordert. Nicht authentifizierte Anforderungen, die mit 401 Unauthorized .__ beantwortet werden sollen. Antworten. An vielen Stellen würde dies die Existenz des Benutzers .__ offenbaren. Daten. Stattdessen antwortet die GitHub-API mit 404 Not Found. Das vielleicht verursachen Probleme für HTTP-Bibliotheken, die von einem nicht autorisierten 401-Server ausgehen Antwort. Die Lösung besteht darin, den Autorisierungsheader manuell zu erstellen.

Powershells Invoke-WebRequest wartet meines Wissens auf eine 401-Antwort, bevor die Anmeldeinformationen gesendet werden. Da GitHub niemals eine solche bereitstellt, werden Ihre Anmeldeinformationen niemals gesendet.

Erstellen Sie die Header manuell

Stattdessen müssen Sie die grundlegenden Auth-Header selbst erstellen.

Die Standardauthentifizierung erfordert eine Zeichenfolge, die aus dem Benutzernamen und dem Kennwort besteht, die durch einen Doppelpunkt user:pass getrennt sind, und sendet dann das Base64-codierte Ergebnis davon.

Code wie dieser sollte funktionieren:

$user = 'user'
$pass = 'pass'

$pair = "$($user):$($pass)"

$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))

$basicAuthValue = "Basic $encodedCreds"

$Headers = @{
    Authorization = $basicAuthValue
}

Invoke-WebRequest -Uri 'https://whatever' -Headers $Headers

Sie könnten einige der String-Verkettungen kombinieren, aber ich wollte es herausstellen, um es klarer zu machen.

96
briantist

Benutze das: 

$root = 'REST_SERVICE_URL'
$user = "user"
$pass= "password"
$secpasswd = ConvertTo-SecureString $pass -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)

$result = Invoke-RestMethod $root -Credential $credential
29
mfralou

Invoke-WebRequest folgt dem RFC2617 wie @briantist angegeben, es gibt jedoch einige Systeme (z. B. JFrog Artifactory), die eine anonyme Verwendung zulassen, wenn der Authorization-Header nicht vorhanden ist, aber mit 401 Forbidden antworten, wenn der Header ungültige Berechtigungsnachweise enthält.

Dies kann verwendet werden, um die 401 Forbidden-Antwort auszulösen und -Credentials zum Laufen zu bringen.

$login = Get-Credential -Message "Enter Credentials for Artifactory"

                              #Basic foo:bar
$headers = @{ Authorization = "Basic Zm9vOmJhcg==" }  

Invoke-WebRequest -Credential $login -Headers $headers -Uri "..."

Dadurch wird beim ersten Mal der ungültige Header gesendet, der in der zweiten Anforderung durch die gültigen Berechtigungsnachweise ersetzt wird, da -Credentials den Header Authorization überschreibt.

Mit Powershell getestet 5.1

3

eine andere Möglichkeit ist die Verwendung von certutil.exe. in.txt als Benutzername: Passwort

certutil -encode in.txt out.txt

Jetzt sollten Sie in der Lage sein, den Auth-Wert von out.txt zu verwenden

$headers = @{ Authorization = "Basic $((get-content out.txt)[1])" }
Invoke-WebRequest -Uri 'https://whatever' -Headers $Headers
0
mayursharma

Ich musste das tun, damit es funktioniert:

$pair = "$($user):$($pass)"
$encodedCredentials = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Pair))
$headers = @{ Authorization = "Basic $encodedCredentials" }
Invoke-WebRequest -Uri $url -Method Get -Headers $headers -OutFile Config.html
0
livy111