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



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



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



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


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



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



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



ноты от Wikipedia на Basic Auth со стороны клиента.



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



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


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



$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 также нарушает стандарт?

843   3  

3 ответов:

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.