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認証プロバイダーを構成する際に、対応するプロパティを使用してrealm(レルム)とcharset(文字セット)を指定できます。通常、クライアントはユーザーが認証情報を入力できるログインダイアログを表示します。その後、クライアントはBase64でエンコードされたユーザー名とパスワードのペアを含む
Authorizationヘッダーを付けてリクエストを送信します。例:Authorization: Basic amV0YnJhaW5zOmZvb2Jhcgサーバーはクライアントから送信された認証情報を検証し、要求されたコンテンツを返します。
Basic認証のインストール
basic認証プロバイダーをインストールするには、installブロック内でbasic関数を呼び出します。
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関数は、ユーザー名とパスワードを検証します。
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関数を使用して、指定されたアルゴリズムとソルトプロバイダーでダイジェスト関数を作成します:
kotlinval digestFunction = getDigestFunction("SHA-256") { "ktor${it.length}" }UserHashedTableAuthの新しいインスタンスを初期化し、以下のプロパティを指定します:tableプロパティを使用して、ユーザー名とハッシュ化されたパスワードのテーブルを提供します。digesterプロパティにダイジェスト関数を割り当てます。
kotlinval hashedUserTable = UserHashedTableAuth( table = mapOf( "jetbrains" to digestFunction("foobar"), "admin" to digestFunction("password") ), digester = digestFunction )validate関数内で、UserHashedTableAuth.authenticate関数を呼び出してユーザーを認証し、認証情報が有効な場合はUserIdPrincipalのインスタンスを返します:kotlininstall(Authentication) { basic("auth-basic-hashed") { realm = "Access to the '/' path" validate { credentials -> hashedUserTable.authenticate(credentials) } } }
