Skip to content

Ktor Server におけるセッション認証

必要となる依存関係: io.ktor:ktor-server-auth, io.ktor:ktor-server-sessions

コード例: auth-form-session

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

セッションは、異なる HTTP リクエスト間でデータを保持するための仕組みを提供します。典型的なユースケースには、ログインしたユーザーの ID やショッピングカートの内容の保存、クライアント上でのユーザー設定の保持などが含まれます。

Ktor では、すでに関連付けられたセッションを持つユーザーを session プロバイダーを使用して認証できます。例えば、ユーザーが初めてウェブフォームを使用してログインしたときに、ユーザー名をクッキーセッションに保存し、その後のリクエストで session プロバイダーを使用してこのユーザーを認可することができます。

Ktor における認証と認可に関する一般的な情報は、Ktor Server での認証と認可セクションで確認できます。

依存関係の追加

session 認証を有効にするには、ビルドスクリプトに以下のアーティファクトを含める必要があります。

  • セッションを使用するために ktor-server-sessions 依存関係を追加します。

    Kotlin
    Groovy
    XML
  • 認証のために ktor-server-auth 依存関係を追加します。

    Kotlin
    Groovy
    XML

セッション認証のフロー

セッションによる認証フローは、アプリケーションでユーザーがどのように認証されるかによって異なる場合があります。フォームベースの認証の場合の例を見てみましょう。

  1. クライアントは、ウェブフォームデータ(ユーザー名とパスワードを含む)を含むリクエストをサーバーに送信します。
  2. サーバーは、クライアントから送信された認証情報を検証し、ユーザー名をクッキーセッションに保存し、リクエストされたコンテンツとユーザー名を含むクッキーを返します。
  3. クライアントは、保護されたリソースに対してクッキーを含む後続のリクエストを行います。
  4. 受信したクッキーデータに基づき、Ktor はこのユーザーのクッキーセッションが存在することを確認し、オプションで受信したセッションデータに対して追加の検証を行います。検証が成功した場合、サーバーはリクエストされたコンテンツを返します。

セッション認証のインストール

session 認証プロバイダーをインストールするには、install ブロック内で必要なセッションタイプを指定して session 関数を呼び出します。

kotlin
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.sessions.*
//...
install(Authentication) {
    session<UserSession> {
        // セッション認証の設定
    }
}

セッション認証の設定

このセクションでは、フォームベースの認証を使用してユーザーを認証し、そのユーザーに関する情報をクッキーセッションに保存し、その後のリクエストで session プロバイダーを使用してこのユーザーを認可する方法を説明します。

完全な例については、auth-form-session を参照してください。

ステップ 1: データクラスの作成

まず、セッションデータを保存するためのデータクラスを作成する必要があります。

kotlin
@Serializable
data class UserSession(val name: String, val count: Int)

ステップ 2: セッションのインストールと設定

データクラスを作成した後、Sessions プラグインをインストールして設定する必要があります。以下の例では、指定されたクッキーパスと有効期限を持つクッキーセッションをインストールして設定しています。

kotlin
install(Sessions) {
    cookie<UserSession>("user_session") {
        cookie.path = "/"
        cookie.maxAgeInSeconds = 60
    }
}

セッションの設定の詳細については、セッション設定の概要を参照してください。

ステップ 3: セッション認証の設定

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

  • validate() 関数は、セッションインスタンスをチェックし、認証に成功した場合は Any 型のプリンシパルを返します。
  • challenge() 関数は、認証が失敗したときに実行されるアクションを指定します。例えば、ログインページにリダイレクトしたり、UnauthorizedResponse を送信したりできます。
kotlin
install(Authentication) {
    session<UserSession>("auth-session") {
        validate { session ->
            if(session.name.startsWith("jet")) {
                session
            } else {
                null
            }
        }
        challenge {
            call.respondRedirect("/login")
        }
    }
}

ステップ 4: セッションにユーザーデータを保存する

ログインしたユーザーに関する情報をセッションに保存するには、call.sessions.set() 関数を使用します。

以下の例は、ウェブフォームを使用したシンプルな認証フローを示しています。

kotlin
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 インスタンス)を取得できます。

kotlin
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 を参照してください。