Skip to content

Ktor Server における Bearer 認証

必要な依存関係: io.ktor:ktor-server-auth

コード例: auth-bearer

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

Bearer 認証スキームは、アクセス制御と認証に使用される HTTP フレームワークの一部です。このスキームには、Bearer トークンと呼ばれるセキュリティトークンが含まれます。Bearer 認証スキームは OAuth または JWT の一部として使用されますが、Bearer トークンを認可するためのカスタムロジックを提供することもできます。

Ktor における認証の全般的な情報については、Ktor Server における認証と認可セクションを参照してください。

Bearer 認証は HTTPS/TLS 経由でのみ使用してください。

依存関係の追加

bearer 認証を有効にするには、ビルドスクリプトに ktor-server-auth アーティファクトを含める必要があります。

Kotlin
Groovy
XML

Bearer 認証のフロー

一般的に、Bearer 認証のフローは次のようになります。

  1. ユーザーが正常に認証およびアクセスの認可を受けた後、サーバーはクライアントにアクセストークンを返します。
  2. クライアントは、Bearer スキーマを使用して Authorization ヘッダーにトークンを渡し、保護されたリソースにリクエストを行うことができます。
    HTTP
    GET http://localhost:8080/
    Authorization: Bearer abc123
  3. サーバーはリクエストを受信し、トークンを検証します。
  4. 検証後、サーバーは保護されたリソースの内容をレスポンスとして返します。

Bearer 認証のインストール

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

kotlin
import io.ktor.server.application.*
import io.ktor.server.auth.*
// ...
install(Authentication) {
    bearer {
        // Bearer 認証の設定
    }
}

オプションで、特定のルートを認証するために使用できるプロバイダー名を指定できます。

Bearer 認証の設定

Ktor でのさまざまな認証プロバイダーの設定方法の概要については、認証の設定を参照してください。このセクションでは、bearer 認証プロバイダー固有の設定について説明します。

ステップ 1: Bearer プロバイダーの設定

bearer 認証プロバイダーは、BearerAuthenticationProvider.Configuration クラスを介して設定を公開します。以下の例では、次の設定が指定されています。

  • realm プロパティは、WWW-Authenticate ヘッダーで渡される realm を設定します。
  • authenticate 関数は、クライアントから送信されたトークンをチェックし、認証に成功した場合は UserIdPrincipal を、失敗した場合は null を返します。
kotlin
install(Authentication) {
    bearer("auth-bearer") {
        realm = "Access to the '/' path"
        authenticate { tokenCredential ->
            if (tokenCredential.token == "abc123") {
                UserIdPrincipal("jetbrains")
            } else {
                null
            }
        }
    }
}

ステップ 2: 特定のリソースの保護

bearer プロバイダーを設定した後、authenticate 関数を使用してアプリケーション内の特定のリソースを保護できます。認証に成功した場合、ルートハンドラー内で call.principal 関数を使用して認証済みの UserIdPrincipal を取得し、認証されたユーザーの名前を取得できます。

kotlin
routing {
    authenticate("auth-bearer") {
        get("/") {
            call.respondText("Hello, ${call.principal<UserIdPrincipal>()?.name}!")
        }
    }
}