Skip to content

Ktorクライアントでのダイジェスト認証

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

コード例: client-auth-digest

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

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

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

ダイジェスト認証のフローは次のようになります。

  1. クライアントは、サーバーアプリケーション内の特定のリソースに対して、Authorizationヘッダーなしでリクエストを行います。

  2. サーバーはクライアントに401 (未承認) レスポンスステータスで応答し、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. サーバーはクライアントによって送信された資格情報を検証し、要求されたコンテンツで応答します。

ダイジェスト認証の設定

ユーザーの資格情報をAuthorizationヘッダーにDigestスキームを使用して送信するには、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