Используйте Invoke-WebRequest с именем пользователя и паролем для базовой аутентификации в API GitHub

Первый Вопрос

С cURL мы можем передать имя пользователя с веб-запросом HTTP следующим образом:

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

на -u флаг принимает имя пользователя для аутентификации, а затем cURL запросит пароль. Пример cURL предназначен для базовая аутентификация с помощью Api GitHub.

как мы аналогично передаем имя пользователя и пароль вместе с Invoke-WebRequest? Конечная цель-пользователь PowerShell с базовой аутентификацией в API GitHub.

Edit (это то, что сработало)

ноты от Википедия На Basic Auth со стороны клиента.

объединить имя пользователя и пароль в одну строку username:password

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

кодируйте строку в вариант RFC2045-MIME Base64, за исключением 76 символов/строк.

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

создайте значение Auth как метод, пробел, а затем закодированную пару Method Base64String

$basicAuthValue = "Basic $base64"

создать заголовок Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

$headers = @{ Authorization = $basicAuthValue }

вызовите веб-запрос

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

спасибо @briantist за помощь!

Обсуждение

версия PowerShell этого более подробна, чем версия cURL. Почему так? @briantist указал, что GitHub нарушает RFC и PowerShell придерживается его. Означает ли это, что cURL также ломается со стандартом?

3 ответов


Я предполагаю базовую аутентификацию здесь.

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

вы можете получить свои учетные данные другими способами (Import-Clixml, etc.), но это должно быть [PSCredential] "объект".

редактировать на основе комментариев:

GitHub нарушает RFC, как они объясняют в ссылка вам предоставлена:

API поддерживает базовую аутентификацию, как определено в RFC2617 с несколькими небольшое различие. Основное отличие заключается в том, что RFC требует неаутентифицированные запросы будут ответил с 401 несанкционированного ответы. Во многих местах это будет раскрывать существование пользователя данные. Вместо этого API GitHub отвечает, что 404 не найден. Май этого года вызывают проблемы для библиотек HTTP, которые предполагают 401 несанкционированный ответ. Решением является ручное ремесло заголовок Authorization.

Powershell Invoke-WebRequest делает, насколько мне известно, ждать ответа 401 перед отправкой учетных данных, и так как GitHub никогда обеспечивает, ваши данные никогда не будут отправлены.

вручную создайте заголовки

вместо этого вам придется создать базовые заголовки auth самостоятельно.

базовая аутентификация принимает строку, состоящую из имени пользователя и пароля, разделенных двоеточием user:pass а затем отправляет кодированный результат Base64.

такой код должен работать:

$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

вы можете объединить некоторые из конкатенации строк, но я хотел сломать чтобы было понятнее.


используйте этот:

$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

Invoke-WebRequest следует RFC2617, как отметил @briantist, однако есть некоторые системы (например, JFrog Artifactory), которые позволяют анонимное использование, если Authorization заголовок отсутствует, но ответит 401 Forbidden Если заголовок содержит недопустимые учетные данные.

это может быть использовано, чтобы вызвать 401 Forbidden ответ и получить -Credentials на работу.

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

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

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

это отправит недопустимый заголовок в первый раз, который будет заменен действительными учетными данными во втором запросе с -Credentials переопределяет Authorization заголовок.

протестировано с помощью Powershell 5.1