GitHub APIでの基本認証には、ユーザー名とパスワードを指定してInvoke-WebRequestを使用します


127

cURLでは、次のようにHTTP Webリクエストでユーザー名を渡すことができます。

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

-uフラグは、認証用のユーザ名を受け入れ、その後、カールがパスワードを要求します。cURLの例は、GitHub Apiを使用した基本認証用です。

同様に、ユーザー名とパスワードをInvoke-WebRequestとともに渡す方法を教えてください。最終的な目標は、GitHub APIの基本認証でPowerShellを使用することです。


$ pairは$pair = "$($user):$($pass)"承認された回答を確認する必要があります。私は上記を使用していましたが、あまりにも多くの苦痛を与えました
Bhavjot

-Credentialリクエストが行われたときに正しい認証ヘッダーが生成されないため、アプローチが機能することを示唆するソリューションはありません。
StingyJack

@ショーン・ルティン-これは質問.....そして回答サイトであり、質問回答サイトではありません。この1人のユーザーは、特定の状況で機能したもの以外に、可能な限り簡潔な質問と回答を表示することを望みます。懸念が、質問に最も近づくのに役立つ答えであった場合、StackExchangeには、最高の/受け入れられた答えをできるだけ質問に近づける機能があります。
user66001

1
@ user66001フィードバックありがとうございます。質問の回答を後で参照できるように独自の回答に移動しました。これは改善だと思います。
Shaun Luttin

@ShaunLuttin-素晴らしいアイデア!:)
user66001

回答:


147

ここでは基本認証を想定しています。

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

資格情報は他の方法(Import-Clixmlなど)で取得できますが、[PSCredential]オブジェクトである必要があります。

コメントに基づいて編集:

彼らがあなたが提供したリンクで説明するように、GitHubはRFCを破っています

APIは、RFC2617で定義されている基本認証をサポートしますが、いくつかのわずかな違いがあります。主な違いは、RFCでは、認証されていない要求に401 Unauthorized応答で応答する必要があることです。多くの場所で、これはユーザーデータの存在を明らかにします。代わりに、GitHub APIは404 Not Foundで応答します。これにより、401 Unauthorized応答を想定するHTTPライブラリで問題が発生する可能性があります。解決策は、Authorizationヘッダーを手動で作成することです。

Invoke-WebRequest私の知る限り、Powershell は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

文字列連結の一部を組み合わせることができますが、わかりやすくするために分割したいと思いました。


1
先ほど述べたように、基本認証で機能しますが、GitHub APIがどのような認証を使用するのかわかりません。あなたは何が期待されているかについていくつかの詳細を投稿することができ、それは私たちが問題を解決するのに役立つかもしれません。
ブライアンティスト、2015年

1
ああ、GitHubは(彼ら自身の承認により)RFCに従っていないようですが、Powershellはそうです。私はより多くの情報と回避策で回答を編集しました。
ブライアンティスト、2015年

1
ええ、これらの種類の呼び出しをたくさん行うつもりなら、これを関数でラップすることをお勧めします。私が言ったように、私は明確にするためにすべての部分を分割しましたが、あなたはそれをすべて1行で行うことができました(それは単に面倒になるでしょう)。
ブライアンティスト、2015年

1
@Aref、使用しているコードを使用して新しい質問を投稿してください。もしそうなら、私に知らせてみてください。
ブライアンティスト、2015年

1
Visual Studio Team Services REST APIに対して認証を試みる場合も、ヘッダーを手動で作成する必要があります
Brent Robinson

44

これを使って:

$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

何らかの理由で、選択した回答をTFS vNextで使用するとうまくいきませんでしたが、これでうまくいきました。どうもありがとう!
Tybs 2016年

選択された回答はAzureでPowershell Runbookを実行してトリガーされたジョブを開始するために機能しませんでしたが、この回答は機能しました。
Sam

7

私はそれを機能させるためにこれをしなければなりませんでした:

$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

6

Invoke-WebRequest@briantistが述べたようにRFC2617に従いますが、Authorizationヘッダーが存在しない場合に匿名での使用を許可するシステム(JFrog Artifactoryなど)がありますが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オーバーライドされるため、2番目のリクエストで有効な資格情報に置き換えられますAuthorization

Powershell 5.1でテスト済み


5

誰かが1つのライナーを必要とするならば:

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

2

別の方法は、certutil.exeを使用して、ユーザー名とパスワードをファイルに保存することです。たとえば、in.txtをユーザー名:パスワードとして保存します。

certutil -encode in.txt out.txt

これで、out.txtのauth値を使用できるはずです。

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

1

これはOPの元のリクエストから少しずれていることはわかっていますが、基本認証が必要なサイトに対してInvoke-WebRequestを使用する方法を探しているときに、これに遭遇しました。

違いは、スクリプトにパスワードを記録したくないということです。代わりに、スクリプトランナーにサイトの資格情報を要求したかったのです。

これが私がそれをどう扱ったかです

$creds = Get-Credential

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

Invoke-WebRequest -Uri $URL -Credential $basicCreds

その結果、スクリプトランナーはU / Pのログインダイアログでプロンプトが表示され、Invoke-WebRequestはこれらの資格情報でサイトにアクセスできます。これは、$ Creds.Passwordがすでに暗号化された文字列であるため機能します。

これが上記の質問に対する同様の解決策を探している人に役立つことを願っていますが、スクリプトにユーザー名またはPWを保存する必要はありません


0

これが私たちの特定の状況でうまくいったものです。

メモは、クライアント側からの基本認証に関するウィキペディアからのものです。助けてくれた@briantistの回答ありがとうございます!

ユーザー名とパスワードを1つの文字列に結合する username:password

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

文字列をBase64のRFC2045-MIMEバリアントにエンコードします。ただし、76文字/行に限定されません。

$bytes = [System.Text.Encoding]::ASCII.GetBytes($pair)
$base64 = [System.Convert]::ToBase64String($bytes)

メソッド、スペース、エンコードされたペアとしてAuth値を作成します Method Base64String

$basicAuthValue = "Basic $base64"

ヘッダーを作成する Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

$headers = @{ Authorization = $basicAuthValue }

Webリクエストを呼び出す

Invoke-WebRequest -uri "https://api.github.com/user" -Headers $headers

これのPowerShellバージョンは、cURLバージョンよりも詳細です。何故ですか?@briantistは、GitHubはRFCに違反しており、PowerShellはそれに固執していると指摘しました。それは、cURLも標準に違反しているということですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.