同等のものは何ですか
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を返します。
これはこれまでのところ私のために働いた唯一の方法です:
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))
Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ...
しかし、私はより良い方法がないとは思わない。
なぜ しかし、それは httpbinサービス で動作します。-Credential
パラメータはあなたのケースでは機能していません。
これを試すことができます:
$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ヘッダーを使用してリクエストを再送信します。これは、最初の要求で資格情報を必要とするサービスでは機能しません。
メソッドが独立して失敗した場合、メソッドを組み合わせる必要があるようです。
資格情報を作成し、要求に追加します。
ヘッダーを作成し、リクエストに追加します。
$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"
資格情報を使用してWebRequestSessionオブジェクトを事前に作成すると、-WebSession
パラメーターを使用しても機能することがわかりました。 PS Credentialオブジェクトの作成方法は、他の回答で既に説明しているため、再ハッシュしません。
$WebSession = New-Object -TypeName Microsoft.PowerShell.Commands.WebRequestSession -Property @{Credentials=$Credential}
Invoke-RestMethod -Uri "your_URI" -WebSession $WebSession
この方法では、最初の呼び出しで認証ヘッダーが送信されるため、401応答が回避されます。
ちなみに、このアプローチは、プロキシの詳細を設定するためにも使用できます(パラメーターを使用して指定した場合、PSのすべてのバージョンで正しく動作しません)。
このバージョンはGet-Credential
のPSCredential
オブジェクト。 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)} ...
#Requires -Version 6
$Uri = 'https://httpbin.org/basic-auth/user/pass'
$Credential = Get-Credential
Invoke-RestMethod -Uri $Uri -Authentication Basic -Credential $Credential
基本的に、ユーザー名とパスワードのペアをエンコードされた資格情報変数として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
に抽出する方法に注意してください。