programing

PowerShell의 Invoke-RestMethod는 curl -u(기본인증)에 상당합니다.

powerit 2023. 4. 8. 09:50
반응형

PowerShell의 Invoke-RestMethod는 curl -u(기본인증)에 상당합니다.

에 상당하는 것은 무엇입니까?

curl -u username:password ...

에 탑재되어 .Invoke-RestMethod이거 해봤어요.

$securePwd = ConvertTo-SecureString "password" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($username, $securePwd)

Invoke-RestMethod -Credential $credential ...

401, Unauthorized가 반환됩니다.

지금까지 이 방법밖에 효과가 없었습니다.

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))

Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ...

하지만 이보다 더 좋은 방법은 없다고 생각해요.

왜 그런지는 모르겠지만 -Credential 파라미터가 작동하지 않습니다. httpbin 서비스에서는 동작합니다.

다음과 같이 시험해 보십시오.

$pwd = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
$cred = New-Object Management.Automation.PSCredential ('PsUser', $pwd)

Invoke-RestMethod 'http://httpbin.org/basic-auth/PsUser/MyPassword' -cred $cred

편집: 코멘트에서 설명한 바와 같이 이 메서드는 첫 번째 요청 시 Authorization 헤더를 전송하지 않습니다.챌린지 응답을 기다린 후 Authorization 헤더와 함께 요청을 재발송합니다.첫 번째 요청 시 credential이 필요한 서비스에서는 작동하지 않습니다.

#Requires -Version 6
$Uri = 'https://httpbin.org/basic-auth/user/pass'
# use "user" and "pass" when prompted for credentials
$Credential = Get-Credential
Invoke-RestMethod -Uri $Uri -Authentication Basic -Credential $Credential

실패했을 경우 메서드를 개별적으로 조합해야 할 것 같습니다.

자격 증명을 생성하여 요청에 추가합니다.

헤더를 생성하여 요청에 추가합니다.

$username = "username";
$password = ConvertTo-SecureString –String "password" –AsPlainText -Force
$credential = New-Object –TypeName "System.Management.Automation.PSCredential" –ArgumentList $username, $password

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))

$getProjectUri = "yourUri"
Invoke-RestMethod -Method Get -Uri $getProjectUri -Headers @{Authorization = "Basic $base64AuthInfo" } -Credential $credential -ContentType "application/json"

은 " "와 함께 합니다.Get-Credential의 »PSCredential 6.합니다.PowerShell 6.0을 사용합니다.은, 을 회피하는 으로, BSTR 콜의 사용을 회피하는 것으로, BSTR 은 「」, 「BSTR」, 「BSTR」로부터 하려고 할 .PSCredential.

$creds = Get-Credential
$unsecureCreds = $creds.GetNetworkCredential()
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $unsecureCreds.UserName,$unsecureCreds.Password)))
Remove-Variable unsecureCreds

Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ...

가 찾은 '아, 아, 아는데요.-WebSessionWebRequestSession credential은 WebRequestSession 。PS Credential 객체의 작성 방법은 이미 다른 답변에서 다루어져 있기 때문에 다시 설명하지 않습니다.

$WebSession = New-Object -TypeName Microsoft.PowerShell.Commands.WebRequestSession -Property @{Credentials=$Credential}
Invoke-RestMethod -Uri "your_URI" -WebSession $WebSession

이 방법에서는 첫 번째 콜에서 인증 헤더가 전송되므로 401 응답을 회피합니다.

덧붙여서, 이 어프로치는 프록시 상세 설정에도 사용할 수 있습니다(파라미터로 지정하면 모든 버전의 PS에서는 정상적으로 동작하지 않습니다).또한 API에서 필요한 경우 쿠키를 처리합니다.

으로는 사용자 를 '비밀번호'로 .Invoke-RestMethodvariable.credentials "로 지정합니다.

나에게 효과가 있었던 것은 다음과 같다.

$USERNAME = 'user'
$PASSWORD = 'password'
$IDP_URL = 'example.com/token'


$credPair = "$($USERNAME):$($PASSWORD)"
$encodedCredentials = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($credPair))

$parameters = @{
    Uri         = $IDP_URL
    Headers     = @{ 'Authorization' = "Basic $encodedCredentials" }
    Method      = 'POST'
    Body        = '...'
    ContentType = '...'
}

Invoke-RestMethod @parameters

해 주십시오.$parameters명령어가 부풀어 오르는 것을 방지합니다.

정말 오래된 질문인 건 알지만 업데이트 내용을 공유하고 싶었어요.PowerShell 기본 인증 기능를 거쳐 MS Docs를 가 있음을 되었습니다.-AllowUnencryptedAuthenticationparameter는 http를 사용하여 접속했기 때문입니다.파라미터에 액세스하기 위해 PS 버전도 업그레이드해야 했습니다.

매개 변수에 대한 설명에서 "암호화되지 않은 연결을 통해 인증 정보 및 암호를 전송할 수 있습니다.기본적으로는 credential 또는 인증 옵션을 https://로 시작하지 않는 URI와 함께 지정하면 오류가 발생하고 암호화되지 않은 연결을 통해 의도하지 않게 일반 텍스트로 비밀 정보가 통신되는 것을 방지하기 위해 요청이 중단됩니다.위험을 감수하고 이 동작을 재정의하려면 암호화되지 않은 AllowUncrypted를 제공하십시오.인증 파라미터"

나는 위의 예들 중 어떤 것도 운이 따르지 않은 채 며칠을 보냈다.최종적으로는, 투고 방법을 특정할 필요가 있었습니다.예를 들어 다음과 같습니다.

$request =  Invoke-WebRequest -Method Post -Uri "https://www.emea-api.morningstar.com/token/oauth" -Headers @{accept='*/*';Authorization='Basic bWFy...encoded username:password...='};

(모바일리)

언급URL : https://stackoverflow.com/questions/24672760/powershells-invoke-restmethod-equivalent-of-curl-u-basic-authentication

반응형