ミドルウェアと認証
横断的な処理を追加し、ルートを保護します。
「ミドルウェアと認証」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
Middleware とは
Middleware は、受信したリクエストとルートハンドラーの間に位置し、リクエストとレスポンスの両方を検査または変更できます。ロギング、CORS、エラー処理、認証に適しています。
import VaporMiddleware プロトコル
カスタムミドルウェアは 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) // trueGuard によるルートの保護
認証機能と 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フィードバックを取得できます。ローカル設定は不要です。