Skip to content

Ktorサーバーでのベアラー認証

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

コード例: auth-bearer

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

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

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

ベアラー認証はHTTPS/TLS経由でのみ使用すべきです。

依存関係の追加

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

Kotlin
Groovy
XML

ベアラー認証フロー

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

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

ベアラー認証のインストール

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

kotlin
import io.ktor.server.application.*
import io.ktor.server.auth.*
// ...
install(Authentication) {
    bearer {
        // Configure bearer authentication
    }
}

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

ベアラー認証の構成

Ktorでさまざまな認証プロバイダーを構成する方法の一般的なアイデアを得るには、認証の構成を参照してください。このセクションでは、bearer認証プロバイダーの構成の詳細について説明します。

ステップ1:ベアラープロバイダーの構成

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

  • realmプロパティは、WWW-Authenticateヘッダーで渡されるレルムを設定します。
  • 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}!")
        }
    }
}