Ktor ServerにおけるBasic認証
必須の依存関係: io.ktor:ktor-server-auth
コード例: auth-basic, auth-basic-hash-table
Basic認証スキームは、アクセス制御と認証に使用されるHTTPフレームワークの一部です。このスキームでは、ユーザー認証情報はユーザー名とパスワードのペアとしてBase64でエンコードされて送信されます。
Ktorでは、ユーザーのログインや特定のルートの保護にBasic認証を使用できます。Ktorでの認証に関する一般的な情報は、Ktor Serverにおける認証と認可セクションで確認できます。
Basic認証ではユーザー名とパスワードが平文で渡されるため、機密情報を保護するにはHTTPS/TLSを使用する必要があります。
依存関係を追加する
basic
認証を有効にするには、ビルドスクリプトにktor-server-auth
アーティファクトを含める必要があります。
Basic認証フロー
Basic認証フローは次のようになります。
- クライアントは、サーバーアプリケーションの特定のルートに対して、
Authorization
ヘッダーなしでリクエストを行います。 - サーバーは、クライアントに
401
(Unauthorized) レスポンスステータスで応答し、WWW-Authenticate
レスポンスヘッダーを使用して、Basic認証スキームがルートを保護するために使用されているという情報を提供します。典型的なWWW-Authenticate
ヘッダーは次のようになります。
WWW-Authenticate: Basic realm="Access to the '/' path", charset="UTF-8"
Ktorでは、basic
認証プロバイダーを設定する際に、対応するプロパティを使用してレルムと文字セットを指定できます。
- 通常、クライアントはログインダイアログを表示し、ユーザーが認証情報を入力できるようにします。その後、クライアントはBase64でエンコードされたユーザー名とパスワードのペアを含む
Authorization
ヘッダー付きでリクエストを行います。例:
Authorization: Basic amV0YnJhaW5zOmZvb2Jhcg
- サーバーは、クライアントから送信された認証情報を検証し、リクエストされたコンテンツで応答します。
Basic認証のインストール
basic
認証プロバイダーをインストールするには、install
ブロック内でbasic関数を呼び出します。
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
関数は、ユーザー名とパスワードを検証します。
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を取得し、認証されたユーザーの名前を取得できます。
routing {
authenticate("auth-basic") {
get("/") {
call.respondText("Hello, ${call.principal<UserIdPrincipal>()?.name}!")
}
}
}
UserHashedTableAuthによる検証
Ktorでは、ユーザー名とパスワードのハッシュを保持するインメモリテーブルに格納されたユーザーを検証するために、UserHashedTableAuthを使用できます。これにより、データソースが漏洩した場合でもユーザーパスワードが危うくなることを防ぐことができます。
ユーザーの検証にUserHashedTableAuth
を使用するには、以下の手順に従います。
- getDigestFunction関数を使用して、指定されたアルゴリズムとソルトプロバイダーでダイジェスト関数を作成します。
val digestFunction = getDigestFunction("SHA-256") { "ktor${it.length}" }
UserHashedTableAuth
の新しいインスタンスを初期化し、以下のプロパティを指定します。table
プロパティを使用して、ユーザー名とハッシュ化されたパスワードのテーブルを提供します。digester
プロパティにダイジェスト関数を割り当てます。
val hashedUserTable = UserHashedTableAuth(
table = mapOf(
"jetbrains" to digestFunction("foobar"),
"admin" to digestFunction("password")
),
digester = digestFunction
)
validate
関数内で、UserHashedTableAuth.authenticate関数を呼び出してユーザーを認証し、認証情報が有効な場合はUserIdPrincipal
のインスタンスを返します。
install(Authentication) {
basic("auth-basic-hashed") {
realm = "Access to the '/' path"
validate { credentials ->
hashedUserTable.authenticate(credentials)
}
}
}