Skip to content

Ktor Client におけるダイジェスト認証

必要な依存関係: io.ktor:ktor-client-auth

コード例: client-auth-digest

ダイジェスト認証(Digest authentication)スキームでは、ユーザー名とパスワードをネットワーク経由で送信する前にハッシュ関数が適用されます。

サーバー側では、Ktor はダイジェスト認証を処理するための Authentication プラグインを提供しています。

undefined

ダイジェスト認証のフロー

ダイジェスト認証のフローは以下の通りです。

  1. クライアントは、Authorization ヘッダーを付けずに、サーバーアプリケーションの特定のリソースに対してリクエストを送信します。

  2. サーバーは、401 (Unauthorized) レスポンスステータスをクライアントに返し、WWW-Authenticate レスポンスヘッダーを使用して、そのルートの保護にダイジェスト認証スキームが使用されていることを通知します。典型的な WWW-Authenticate ヘッダーは以下のようになります。

    WWW-Authenticate: Digest
            realm="Access to the '/' path",
            nonce="e4549c0548886bc2",
            algorithm="MD5"
  3. 通常、クライアントはユーザーが認証情報を入力できるログインダイアログを表示します。その後、クライアントは以下の Authorization ヘッダーを付けてリクエストを送信します。

    Authorization: Digest username="jetbrains",
            realm="Access to the '/' path",
            nonce="e4549c0548886bc2",
            uri="/",
            algorithm=MD5,
            response="6299988bb4f05c0d8ad44295873858cf"

    response の値は、次のように生成されます。

    a. HA1 = MD5(username:realm:password)

    b. HA2 = MD5(method:digestURI)

    c. response = MD5(HA1:nonce:HA2)

  4. サーバーはクライアントから送信された認証情報を検証し、要求されたコンテンツを返します。

ダイジェスト認証の設定

Digest スキームを使用して Authorization ヘッダーでユーザー認証情報を送信するには、次のように digest 認証プロバイダーを設定する必要があります。

  1. install ブロック内で digest 関数を呼び出します。
  2. DigestAuthCredentials を使用して必要な認証情報を指定し、このオブジェクトを credentials 関数に渡します。
  3. 必要に応じて、realm プロパティを使用して領域(realm)を設定します。
kotlin
val client = HttpClient(CIO) {
    install(Auth) {
        digest {
            credentials {
                DigestAuthCredentials(username = "jetbrains", password = "foobar")
            }
            realm = "Access to the '/' path"
        }
    }
}

完全な例はこちらにあります: client-auth-digest