tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShell の Invoke-WebRequest や Invoke-RestMethod でセッションを利用する

  • 本記事は PowerShell 3.0 以上を対象にしています。

前回のSumoLogic API 用の PowerShell モジュール更新が2014年1月。で、その更新の直後に SumoLogic側で API制限がされました。

具体的には Credential を使ってるの接続回数の制限なのですが、そういえば対応してなかったので更新しました。今後、SumoLogicAPI を叩くときは、初回だけ認証とって以降はその際に発行されたセッションクッキーを利用することができます。

今回の記事は、Invoke-RestMethod で この対応ができるんですよーっていう。

目次

PSSumoLogicAPIの流れ

認証には次のファンクションを利用します。

CommandType Name                                 ModuleName    
----------- ----                                 ----------    
Function    Get-PSSumoLogicApiCredential         PSSumoLogicAPI
Function    Get-PSSumoLogicApiWebSession         PSSumoLogicAPI
Function    New-PSSumoLogicApiCredential         PSSumoLogicAPI

今回加えた変更は、初回のAPIアクセス認証 後に WebSession で以降の処理ができるようにしたものです。

実際に WebSessionを使った流れを見てみます。

認証情報の保持

SumoLogic せんせーは、まだ Basic認証なんです。ほげー。

ユーザー名とパスワードを入力することで、ファイルに保持します。 作ったファイルにかかれているのは、暗号化されたパスワードで 復号は認証を作ったPCでのみ可能です。

Userパラメータを省略した場合、configで指定したユーザーがデフォルトでUserに入ります。

config に記述したユーザーで処理しますが、任意のユーザーでhoge@hoge.com で認証をとるには -user を指定します。

New-PSSumoLogicApiCredential -user hoge@hoge.com

これで認証情報がSecureCredential として保持されます。

保持した認証情報を読み取る

作成した認証ファイルを読み込んで、パスワードをSecureCredentialに復号しPSCredentialを作ります。

configで指定したユーザーがデフォルトでUserに入ります。

Get-PSSumoLogicApiCredential

もちろんユーザーの指定も可能です。

Get-PSSumoLogicApiCredential -user hoge@hoge.com

前回は、このユーザー認証を毎回のAPI Callに使ってたのでキチガイでしたね。

初回だけユーザー認証を行いセッション取得

先ほど復号した認証を利用して、セッションを取得します。以降のAPIはすべてこのセッションで叩きます。

$credential = Get-PSSumoLogicApiCredential
Get-PSSumoLogicApiWebSession

取得したセッションは、$PSSumoLogicAPI.WebSession に格納され、暗黙で利用されるので気にすることはありません。

APIを叩く

あとは、WebSessionで好きなようにAPIを叩けます。

CommandType Name                                 ModuleName    
----------- ----                                 ----------    
Function    Get-PSSumoLogicApiCollector          PSSumoLogicAPI
Function    Get-PSSumoLogicApiCollectorSource    PSSumoLogicAPI
Function    Get-PSSumoLogicApiCredential         PSSumoLogicAPI
Function    Remove-PSSumoLogicApiCollector       PSSumoLogicAPI
Function    Remove-PSSumoLogicApiCollectorSource PSSumoLogicAPI
Function    Set-PSSumoLogicApiCollectorSource    PSSumoLogicAPI

Collector を取得するならこれですね。この辺は、 すべて Credential から WebSession にパラメータを変えています。

Get-PSSumoLogicApiCollectors

これらの処理では、セッションを利用するので、これまでよりもAPIの応答が早くなっています。

SessionVariableの取得

Invoke-RestMethod や WebRequest で接続した時の セッションは SessionVariable パラメータで取得できます。

Invoke-RestMethod -Uri $uri -Method Get -Credential $Credential -SessionVariable SessionVariable

この場合は、 SessionVariableという変数名に入れるように指定しており$SessionVariable で取得した内容が取れます。

WebSessionは、[Microsoft.PowerShell.Commands.WebRequestSession]で返却され、その中には認証されたクッキー情報も入っています。

自分で定義するとこうですね。

[Microsoft.PowerShell.Commands.WebRequestSession]@{
    Headers                        = New-Object 'System.Collections.Generic.Dictionary[string,string]'
    Cookies                        = New-Object System.Net.CookieContainer
    UseDefaultCredentials          = $false
    Credentials                    = New-Object System.Net.NetworkCredential
    Certificates                   = New-Object System.Security.Cryptography.X509Certificates.X509CertificateCollection
    UserAgent                      = "Mozilla/5.0 (Windows NT; Windows NT 6.2; ja-JP) WindowsPowerShell/4.0"
    Proxy                          = New-Object System.Net.WebProxy
    MaximumRedirection             = -1
}

SumoLogic は、このSessionに含まれるクッキーで以降の接続を認証するので利用するわけです。

PowerShell でいろいろほげほげすると、結構便利にできるんですが SessionVariable は覚えておくと Webフォームの認証に利用できたりもするのでオススメです。

まとめ

ちょっとは使いやすくなりましたか?