Ktor Server におけるセッション認証
必要となる依存関係: io.ktor:ktor-server-auth, io.ktor:ktor-server-sessions
コード例: auth-form-session
セッションは、異なる HTTP リクエスト間でデータを保持するための仕組みを提供します。典型的なユースケースには、ログインしたユーザーの ID やショッピングカートの内容の保存、クライアント上でのユーザー設定の保持などが含まれます。
Ktor では、すでに関連付けられたセッションを持つユーザーを session プロバイダーを使用して認証できます。例えば、ユーザーが初めてウェブフォームを使用してログインしたときに、ユーザー名をクッキーセッションに保存し、その後のリクエストで session プロバイダーを使用してこのユーザーを認可することができます。
Ktor における認証と認可に関する一般的な情報は、Ktor Server での認証と認可セクションで確認できます。
依存関係の追加
session 認証を有効にするには、ビルドスクリプトに以下のアーティファクトを含める必要があります。
セッションを使用するために
ktor-server-sessions依存関係を追加します。KotlinGroovyXML認証のために
ktor-server-auth依存関係を追加します。KotlinGroovyXML
セッション認証のフロー
セッションによる認証フローは、アプリケーションでユーザーがどのように認証されるかによって異なる場合があります。フォームベースの認証の場合の例を見てみましょう。
- クライアントは、ウェブフォームデータ(ユーザー名とパスワードを含む)を含むリクエストをサーバーに送信します。
- サーバーは、クライアントから送信された認証情報を検証し、ユーザー名をクッキーセッションに保存し、リクエストされたコンテンツとユーザー名を含むクッキーを返します。
- クライアントは、保護されたリソースに対してクッキーを含む後続のリクエストを行います。
- 受信したクッキーデータに基づき、Ktor はこのユーザーのクッキーセッションが存在することを確認し、オプションで受信したセッションデータに対して追加の検証を行います。検証が成功した場合、サーバーはリクエストされたコンテンツを返します。
セッション認証のインストール
session 認証プロバイダーをインストールするには、install ブロック内で必要なセッションタイプを指定して session 関数を呼び出します。
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.sessions.*
//...
install(Authentication) {
session<UserSession> {
// セッション認証の設定
}
}セッション認証の設定
このセクションでは、フォームベースの認証を使用してユーザーを認証し、そのユーザーに関する情報をクッキーセッションに保存し、その後のリクエストで session プロバイダーを使用してこのユーザーを認可する方法を説明します。
完全な例については、auth-form-session を参照してください。
ステップ 1: データクラスの作成
まず、セッションデータを保存するためのデータクラスを作成する必要があります。
@Serializable
data class UserSession(val name: String, val count: Int)ステップ 2: セッションのインストールと設定
データクラスを作成した後、Sessions プラグインをインストールして設定する必要があります。以下の例では、指定されたクッキーパスと有効期限を持つクッキーセッションをインストールして設定しています。
install(Sessions) {
cookie<UserSession>("user_session") {
cookie.path = "/"
cookie.maxAgeInSeconds = 60
}
}セッションの設定の詳細については、セッション設定の概要を参照してください。
ステップ 3: セッション認証の設定
session 認証プロバイダーは、SessionAuthenticationProvider.Config クラスを通じて設定を公開します。以下の例では、次の設定が指定されています。
validate()関数は、セッションインスタンスをチェックし、認証に成功した場合はAny型のプリンシパルを返します。challenge()関数は、認証が失敗したときに実行されるアクションを指定します。例えば、ログインページにリダイレクトしたり、UnauthorizedResponseを送信したりできます。
install(Authentication) {
session<UserSession>("auth-session") {
validate { session ->
if(session.name.startsWith("jet")) {
session
} else {
null
}
}
challenge {
call.respondRedirect("/login")
}
}
}ステップ 4: セッションにユーザーデータを保存する
ログインしたユーザーに関する情報をセッションに保存するには、call.sessions.set() 関数を使用します。
以下の例は、ウェブフォームを使用したシンプルな認証フローを示しています。
authenticate("auth-form") {
post("/login") {
val userName = call.principal<UserIdPrincipal>()?.name.toString()
call.sessions.set(UserSession(name = userName, count = 1))
call.respondRedirect("/hello")
}
}フォームベースの認証フローの詳細については、フォームベースの認証のドキュメントを参照してください。
ステップ 5: 特定のリソースを保護する
session プロバイダーを設定した後、アプリケーション内の特定のリソースを authenticate() 関数を使用して保護できます。
認証に成功すると、ルートハンドラー内で call.principal() 関数を使用して、認証されたプリンシパル(この場合は UserSession インスタンス)を取得できます。
authenticate("auth-session") {
get("/hello") {
val userSession = call.principal<UserSession>()
call.sessions.set(userSession?.copy(count = userSession.count + 1))
call.respondText("Hello, ${userSession?.name}! Visit count is ${userSession?.count}.")
}
}完全な例については、auth-form-session を参照してください。
