web-dev-qa-db-ja.com

PowerShellのcurl -u(基本認証)と同等のInvoke-RestMethod

同等のものは何ですか

curl -u username:password ...

powerShellのInvoke-RestMethod?私はこれを試しました:

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

Invoke-RestMethod -Credential $credential ...

しかし、401 Unauthorizedを返します。

52
Borek Bernard

これはこれまでのところ私のために働いた唯一の方法です:

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

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

しかし、私はより良い方法がないとは思わない。

90
Borek Bernard

なぜ-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

Edit:コメントに記載されているように、このメソッドは最初のリクエストでAuthorizationヘッダーを送信しません。チャレンジレスポンスを待機してから、Authorizationヘッダーを使用してリクエストを再送信します。これは、最初の要求で資格情報を必要とするサービスでは機能しません。

14
Rynant

メソッドが独立して失敗した場合、メソッドを組み合わせる必要があるようです。

資格情報を作成し、要求に追加します。

ヘッダーを作成し、リクエストに追加します。

$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"
8

資格情報を使用してWebRequestSessionオブジェクトを事前に作成すると、-WebSessionパラメーターを使用しても機能することがわかりました。 PS Credentialオブジェクトの作成方法は、他の回答で既に説明しているため、再ハッシュしません。

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

この方法では、最初の呼び出しで認証ヘッダーが送信されるため、401応答が回避されます。

ちなみに、このアプローチは、プロキシの詳細を設定するためにも使用できます(パラメーターを使用して指定した場合、PSのすべてのバージョンで正しく動作しません)。

3
paulf

このバージョンはGet-CredentialPSCredentialオブジェクト。 PowerShell 6.0ではクロスプラットフォームでも機能します。これは、PSCredentialからパスワードを抽出しようとするときに提案されるBSTR呼び出しの使用を回避することでこれを行います。

$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)} ...
2
Jason Ritchie
#Requires -Version 6
$Uri = 'https://httpbin.org/basic-auth/user/pass'
$Credential = Get-Credential
Invoke-RestMethod -Uri $Uri -Authentication Basic -Credential $Credential
0
Jaqueline Vanek

基本的に、ユーザー名とパスワードのペアをエンコードされた資格情報変数としてInvoke-RestMethodに渡す必要があります。

私のために働いたのは次のことでした:

$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に抽出する方法に注意してください。

0