programing

GitHub API에서 기본 인증을 위해 사용자 이름 및 암호와 함께 Invoke-WebRequest 사용

minimums 2023. 5. 13. 09:23
반응형

GitHub API에서 기본 인증을 위해 사용자 이름 및 암호와 함께 Invoke-WebRequest 사용

cURL을 사용하면 다음과 같이 HTTP 웹 요청으로 사용자 이름을 전달할 수 있습니다.

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

-uflag는 인증을 위한 사용자 이름을 수락한 다음 cURL이 암호를 요청합니다.cURL 예제는 GitHub API를 사용한 기본 인증을 위한 것입니다.

Invoke-WebRequest와 함께 사용자 이름과 암호를 전달하는 방법은 무엇입니까?궁극적인 목표는 GitHub API에서 기본 인증을 사용하는 PowerShell을 사용하는 것입니다.

저는 여기서 기본 인증을 가정하고 있습니다.

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

방법으로 수 .Import-Clixml등), 하지만 반드시 다음과 같아야 합니다.[PSCredential]물건.

주석을 기준으로 편집:

GitHub은 제공한 링크에서 설명한 대로 RFC를 위반하고 있습니다.

이 API는 RFC2617에 정의된 기본 인증을 지원하지만 약간의 차이가 있습니다.주요 차이점은 RFC가 인증되지 않은 요청에 401개의 인증되지 않은 응답으로 응답해야 한다는 것입니다.많은 곳에서, 이것은 사용자 데이터의 존재를 드러낼 것입니다.대신 GitHub API는 404 Not Found로 응답합니다.이로 인해 401 무단 응답을 가정하는 HTTP 라이브러리에 문제가 발생할 수 있습니다.해결책은 권한 부여 헤더를 수동으로 작성하는 것입니다.

파워의셸▁powersInvoke-WebRequest자격 증명을 보내기 전에 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

라이너 하나가 필요한 경우:

iwr -Uri 'https://api.github.com/user' -Headers @{ Authorization = "Basic "+ [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("user:pass")) }

Invoke-WebRequest는 @언급한 대로, @briantist가 RFC2617을 참조하거나 RFC2617을 참조할 경우 할 수 : Artificory이 있습니다.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로 테스트됨

저는 그것을 작동시키기 위해 이것을 해야만 했습니다.

$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

WebRequest를 사용하는 또 다른 방법이 있습니다. 당신에게 도움이 되길 바랍니다.

$user = 'whatever'
$pass = 'whatever'
$secpasswd = ConvertTo-SecureString $pass -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)
$headers = @{ Authorization = "Basic Zm9vOmJhcg==" }  
Invoke-WebRequest -Credential $credential -Headers $headers -Uri "https://dc01.test.local/"

이것이 우리의 특별한 상황에 효과가 있었던 것입니다.

참고 사항은 클라이언트 측의 기본 인증에 대한 위키백과의 것입니다.도움에 대한 @briantist의 답변에 감사드립니다!

사용자 이름과 암호를 단일 문자열로 결합username:password

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

문자열을 76자/행으로 제한되지 않는 한 Base64의 RFC2045-MIME 변형으로 인코딩합니다.

$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

이 버전의 PowerShell 버전은 cURL 버전보다 더 상세합니다.왜 그런 것일까요?@briantist는 GitHub이 RFC를 파괴하고 있으며 PowerShell이 RFC를 고수하고 있다고 지적했습니다.그럼 cURL도 기준에 어긋난다는 뜻인가요?

또 다른 방법은 certifil을 사용하는 것입니다.exe 사용자 이름과 암호를 파일에 저장합니다. 예를 들어 in.txt를 사용자 이름:password로 저장합니다.

certutil -encode in.txt out.txt

이제 처음부터 auth 값을 사용할 수 있습니다.txt

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

저는 이것이 OP의 원래 요청에서 약간 벗어난다는 것을 알지만, 기본 인증이 필요한 사이트에 대해 Invoke-WebRequest를 사용하는 방법을 찾던 중 우연히 발견했습니다.

다른 점은 비밀번호를 스크립트에 기록하고 싶지 않았다는 것입니다.대신 스크립트 실행자에게 사이트에 대한 자격 증명을 묻는 메시지를 표시하려고 했습니다.

제가 처리한 방법은 다음과 같습니다.

$creds = Get-Credential

$basicCreds = [pscredential]::new($Creds.UserName,$Creds.Password)

Invoke-WebRequest -Uri $URL -Credential $basicCreds

그 결과 스크립트 실행자에게 U/P에 대한 로그인 대화 상자가 표시되고 Invoke-WebRequest가 해당 자격 증명으로 사이트에 액세스할 수 있습니다.$Creds 때문에 작동합니다.암호가 이미 암호화된 문자열입니다.

스크립트에 사용자 이름이나 PW를 저장하지 않고 위 질문과 유사한 솔루션을 찾는 사람에게 도움이 되기를 바랍니다.

언급URL : https://stackoverflow.com/questions/27951561/use-invoke-webrequest-with-a-username-and-password-for-basic-authentication-on-t

반응형