1. ホーム
  2. powershell

[解決済み] GitHub API の基本認証にユーザー名とパスワードを指定して Invoke-WebRequest を使用する

2022-04-25 04:20:21

質問

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

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

-u フラグは、認証のためのユーザ名を受け付け、その後、cURL はパスワードを要求します。cURL の例では GitHub Api による基本認証 .

同様にInvoke-WebRequestでユーザー名とパスワードを渡すにはどうしたらよいでしょうか。最終的な目標は、GitHub API の Basic 認証で PowerShell を使いこなすことです。

どのように解決するのですか?

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

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

他の手段でクレデンシャルを取得することも可能です( Import-Clixml など)でなければなりません。 [PSCredential] オブジェクトを作成します。

コメントを元に編集します。

GitHubはRFCを破っています。 リンク :

<ブロッククオート

このAPIは、RFC2617で定義されたBasic Authenticationをサポートしています。 が若干異なります。主な違いは、RFCでは 認証されていないリクエストには、401 Unauthorized というレスポンスが返ってきます。多くの場合、これはユーザーの存在を開示することになります。 のデータを使用します。その代わり、GitHub APIは404 Not Foundで応答します。これは 401 Unauthorizedを想定しているHTTPライブラリでは、問題が発生します。 レスポンスを返すことができます。解決策は、Authorizationヘッダを手動で作成することです。

Powershellの Invoke-WebRequest は、私の知る限りでは 401 レスポンスを待ってから認証情報を送信するようです。

手動でヘッダを構築する

代わりに、基本的な認証ヘッダを自分で作成する必要があります。

基本認証では、ユーザー名とパスワードをコロンで区切った文字列を受け取ります。 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

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