0Pricing
Swift Academy · レッスン

ミドルウェアと認証

横断的な処理を追加し、ルートを保護します。

「ミドルウェアと認証」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

Middleware とは

Middleware は、受信したリクエストとルートハンドラーの間に位置し、リクエストとレスポンスの両方を検査または変更できます。ロギング、CORS、エラー処理、認証に適しています。

import Vapor

Middleware プロトコル

カスタムミドルウェアは AsyncMiddleware に準拠し、respond(to:chainingTo:) を実装します。必要な処理を行った後、next.respond(to:) を呼び出してチェーンを続行します。

struct LogMiddleware: AsyncMiddleware {
    func respond(to req: Request, chainingTo next: AsyncResponder) async throws -> Response {
        req.logger.info("Incoming: " + req.url.path)
        return try await next.respond(to: req)
    }
}

Middleware のグローバル登録

すべてのリクエストで実行するには、ミドルウェアを app.middleware に追加します。順序が重要で、ミドルウェアは追加された順番に実行されます。

app.middleware.use(LogMiddleware())

組み込み Middleware

Vapor には便利なミドルウェアが含まれています。ErrorMiddleware は送出されたエラーをレスポンスに変換し、FileMiddleware は静的ファイルを提供し、CORSMiddleware はクロスオリジンリクエストを処理します。

let cors = CORSMiddleware(configuration: .default())
app.middleware.use(cors)

ルート固有の Middleware

ミドルウェアとともにルートをグループ化すると、一部のルートだけに適用できます。グループ内のルートは保護され、それ以外のルートには適用されません。

let protected = app.grouped(LogMiddleware())
protected.get("dashboard") { req in "Secret dashboard" }

認証の概念

Vapor の認証システムは 2 つの要素で構成されます。1 つはAuthenticatableモデル(ユーザー)で、もう 1 つは認証情報を検証し、ユーザーをリクエストに保存するAuthenticatorミドルウェアです。

final class AppUser: Model, Content, Authenticatable {
    static let schema = "users"
    @ID(key: .id) var id: UUID?
    @Field(key: "username") var username: String
    @Field(key: "password_hash") var passwordHash: String
    init() {}
}

Basic Authenticator の作成

AsyncBasicAuthenticator は HTTP Basic 認証を処理します。authenticate(basic:for:) を実装し、ユーザーを検索してパスワードを検証し、成功したら req.auth.login(user) を呼び出します。

struct UserAuthenticator: AsyncBasicAuthenticator {
    func authenticate(basic: BasicAuthorization, for req: Request) async throws {
        guard let user = try await AppUser.query(on: req.db)
            .filter(\.$username == basic.username).first() else { return }
        if try Bcrypt.verify(basic.password, created: user.passwordHash) {
            req.auth.login(user)
        }
    }
}

Bcrypt によるパスワードのハッシュ化

平文のパスワードを保存してはいけません。Vapor には Bcrypt が組み込まれており、サインアップ時のハッシュ化とログイン時の検証に使えます。ハッシュ化は一方向の処理であり、検証では入力されたパスワードと保存済みのハッシュを比較します。

let hash = try Bcrypt.hash("s3cret")
let ok = try Bcrypt.verify("s3cret", created: hash) // true

Guard によるルートの保護

認証機能と AppUser.guardMiddleware() を組み合わせると、認証されていないリクエストを 401 で拒否できます。保護するルートを、その両方の背後にグループ化します。

let protected = app.grouped(
    UserAuthenticator(),
    AppUser.guardMiddleware()
)
protected.get("me") { req -> String in
    let user = try req.auth.require(AppUser.self)
    return user.username
}

認証済みユーザーの取得

保護されたハンドラー内では、req.auth.require(_:)(ユーザーがいない場合はエラーをスローします)または req.auth.get(_:)(オプショナル)を使ってログイン中のユーザーを取得します。これにより、現在のユーザーに合わせてデータの範囲を限定できます。

app.get("profile") { req -> String in
    let user = try req.auth.require(AppUser.self)
    return "Hello, " + user.username
}

トークン認証

APIでは、ベアラートークンが一般的です。トークンモデルが ModelTokenAuthenticatable に準拠すると、Vaporが Authorization: Bearer ... ヘッダーを検証し、関連付けられたユーザーを自動的に読み込めるようになります。

let tokenProtected = app.grouped(
    UserToken.authenticator(),
    AppUser.guardMiddleware()
)

クイックチェック:Middlewareと認証

理解度を確認しましょう。

まとめ:Middlewareと認証

リクエストをインターセプトして保護する方法を学びました。

  • Middleware(AsyncMiddleware)はリクエストをラップします。グローバルまたはルートグループ単位で登録できます。
  • ErrorMiddleware や CORSMiddleware などの組み込みMiddlewareを使用します。
  • ユーザーを Authenticatable に準拠させ、Authenticator を記述して、req.auth.login を呼び出します。
  • Bcrypt でハッシュ化し、guardMiddleware() でルートを保護して、req.auth.require からユーザーを取得します。

よくある質問

「ミドルウェアと認証」レッスンは無料ですか?

はい。「ミドルウェアと認証」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「ミドルウェアと認証」で何を学びますか?

横断的な処理を追加し、ルートを保護します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「ミドルウェアと認証」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ルーティングとリクエスト処理
  2. コンテンツとJSONエンコーディング
  3. Fluent ORMとモデル
  4. ミドルウェアと認証
← Swift Academyに戻る