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

Первоначальный вопрос

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

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

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

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

Редактировать (это то, что работает)

Заметки из Википедии на 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 также нарушает стандарт?

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

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

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

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

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

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

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

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

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

Обычная проверка подлинности берет строку, состоящую из имени пользователя и пароля, разделенных пользователем двоеточия 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 response и получения -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

Interesting Posts
Давайте будем гением компьютера.