Skip to content

Ktor ServerにおけるBasic認証

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

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

ネイティブサーバー
KtorはKotlin/Nativeをサポートしており、追加のランタイムや仮想マシンなしでサーバーを実行できます。
のサポート: ✅

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認証プロバイダーを設定する際に、対応するプロパティを使用してレルムと文字セットを指定できます。

  1. 通常、クライアントはログインダイアログを表示し、ユーザーが認証情報を入力できるようにします。その後、クライアントはBase64でエンコードされたユーザー名とパスワードのペアを含むAuthorizationヘッダー付きでリクエストを行います。例:
Authorization: Basic amV0YnJhaW5zOmZvb2Jhcg
  1. サーバーは、クライアントから送信された認証情報を検証し、リクエストされたコンテンツで応答します。

Basic認証のインストール

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

kotlin
import io.ktor.server.application.*
import io.ktor.server.auth.*
// ...
install(Authentication) {
    basic {
        // Configure basic authentication
    }
}

必要に応じて、プロバイダー名を指定できます。これは、指定されたルートを認証するために使用できます。

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}" }
  1. UserHashedTableAuthの新しいインスタンスを初期化し、以下のプロパティを指定します。
    • tableプロパティを使用して、ユーザー名とハッシュ化されたパスワードのテーブルを提供します。
    • digesterプロパティにダイジェスト関数を割り当てます。
kotlin
val hashedUserTable = UserHashedTableAuth(
    table = mapOf(
        "jetbrains" to digestFunction("foobar"),
        "admin" to digestFunction("password")
    ),
    digester = digestFunction
)
  1. validate関数内で、UserHashedTableAuth.authenticate関数を呼び出してユーザーを認証し、認証情報が有効な場合はUserIdPrincipalのインスタンスを返します。
kotlin
install(Authentication) {
    basic("auth-basic-hashed") {
        realm = "Access to the '/' path"
        validate { credentials ->
            hashedUserTable.authenticate(credentials)
        }
    }
}