Skip to content

Ktor ServerにおけるBasic認証

必須の依存関係: io.ktor:ktor-server-auth

コード例: auth-basic, auth-basic-hash-table

Nativeサーバー
Ktor supports Kotlin/Native and allows you to run a server without an additional runtime or virtual machine.
のサポート: ✅

Basic認証スキームは、アクセス制御と認証に使用されるHTTPフレームワークの一部です。このスキームでは、ユーザーの認証情報は、Base64を使用してエンコードされたユーザー名とパスワードのペアとして送信されます。

Ktorでは、ユーザーのログインや特定のルートの保護にBasic認証を使用できます。Ktorにおける認証の一般的な情報については、Ktor Serverにおける認証と認可セクションを参照してください。

Basic認証はユーザー名とパスワードをプレーンテキストとして送信するため、機密情報を保護するにはHTTPS/TLSを使用する必要があります。

依存関係の追加

basic認証を有効にするには、ビルドスクリプトにktor-server-authアーティファクトを含める必要があります。

Kotlin
Groovy
XML

Basic認証のフロー

Basic認証のフローは以下の通りです:

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

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

    WWW-Authenticate: Basic realm="Access to the '/' path", charset="UTF-8"

    Ktorでは、basic認証プロバイダーを構成する際に、対応するプロパティを使用してrealm(レルム)とcharset(文字セット)を指定できます。

  3. 通常、クライアントはユーザーが認証情報を入力できるログインダイアログを表示します。その後、クライアントはBase64でエンコードされたユーザー名とパスワードのペアを含むAuthorizationヘッダーを付けてリクエストを送信します。例:

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

Basic認証のインストール

basic認証プロバイダーをインストールするには、installブロック内でbasic関数を呼び出します。

kotlin
import io.ktor.server.application.*
import io.ktor.server.auth.*
// ...
install(Authentication) {
    basic {
        // Basic認証の構成
    }
}

オプションで、特定のルートを認証するために使用できるプロバイダー名を指定することもできます。

Basic認証の構成

Ktorでさまざまな認証プロバイダーを構成する方法の概要については、認証の構成を参照してください。このセクションでは、basic認証プロバイダー固有の構成について説明します。

ステップ1:Basicプロバイダーを構成する

basic認証プロバイダーは、BasicAuthenticationProvider.Configurationクラスを通じて設定を公開しています。以下の例では、次の設定が指定されています。

  • realmプロパティは、WWW-Authenticateヘッダーで渡されるレルムを設定します。
  • validate関数は、ユーザー名とパスワードを検証します。
kotlin
install(Authentication) {
    basic("auth-basic") {
        realm = "Access to the '/' path"
        validate { credentials ->
            if (credentials.name == "jetbrains" && credentials.password == "foobar") {
                UserIdPrincipal(credentials.name)
            } else {
                null
            }
        }
    }
}

validate関数はUserPasswordCredentialをチェックし、認証に成功した場合はUserIdPrincipalを、失敗した場合はnullを返します。

UserHashedTableAuthを使用して、ユーザー名とパスワードのハッシュを保持するメモリ内テーブルに保存されたユーザーを検証することもできます。

ステップ2:特定のリソースを保護する

basicプロバイダーを構成した後、authenticate関数を使用してアプリケーション内の特定のリソースを保護できます。認証に成功した場合、ルートハンドラー内でcall.principal関数を使用して認証済みのUserIdPrincipalを取得し、認証されたユーザーの名前を取得できます。

kotlin
routing {
    authenticate("auth-basic") {
        get("/") {
            call.respondText("Hello, ${call.principal<UserIdPrincipal>()?.name}!")
        }
    }
}

UserHashedTableAuthで検証する

Ktorでは、UserHashedTableAuthを使用して、ユーザー名とパスワードのハッシュを保持するメモリ内テーブルに保存されたユーザーを検証できます。これにより、データソースが漏洩した場合でもユーザーのパスワードが侵害されるのを防ぐことができます。

ユーザーの検証にUserHashedTableAuthを使用するには、以下の手順に従ってください:

  1. getDigestFunction関数を使用して、指定されたアルゴリズムとソルトプロバイダーでダイジェスト関数を作成します:

    kotlin
    val digestFunction = getDigestFunction("SHA-256") { "ktor${it.length}" }
  2. UserHashedTableAuthの新しいインスタンスを初期化し、以下のプロパティを指定します:

    • tableプロパティを使用して、ユーザー名とハッシュ化されたパスワードのテーブルを提供します。
    • digesterプロパティにダイジェスト関数を割り当てます。
    kotlin
    val hashedUserTable = UserHashedTableAuth(
        table = mapOf(
            "jetbrains" to digestFunction("foobar"),
            "admin" to digestFunction("password")
        ),
        digester = digestFunction
    )
  3. validate関数内で、UserHashedTableAuth.authenticate関数を呼び出してユーザーを認証し、認証情報が有効な場合はUserIdPrincipalのインスタンスを返します:

    kotlin
    install(Authentication) {
        basic("auth-basic-hashed") {
            realm = "Access to the '/' path"
            validate { credentials ->
                hashedUserTable.authenticate(credentials)
            }
        }
    }