Autentikasi
Penjelasan
Vapor menyediakan sistem autentikasi terpadu lewat protocol Authenticatable. Untuk autentikasi berbasis model database (misalnya Pengguna login dengan email+password), model tersebut conform ke ModelAuthenticatable, yang mewajibkan menentukan usernameKey, passwordHashKey, dan method verify(password:) untuk mencocokkan password mentah dengan hash yang tersimpan (biasanya pakai Bcrypt). Untuk melindungi route setelah login (mengenali token/sesi pada request berikutnya), kamu memakai middleware seperti Model.authenticator() (untuk basic auth email+password) atau Token.authenticator() (untuk bearer token). Tambahkan juga guardMiddleware() supaya request TANPA autentikasi valid otomatis ditolak dengan 401, bukan diteruskan begitu saja ke handler.
Contoh Konsep
import Fluent
import Vapor
final class Pengguna: Model, Content, ModelAuthenticatable {
static let schema = "pengguna"
static let usernameKey = \Pengguna.$email
static let passwordHashKey = \Pengguna.$passwordHash
@ID(key: .id) var id: UUID?
@Field(key: "email") var email: String
@Field(key: "password_hash") var passwordHash: String
init() { }
func verify(password: String) throws -> Bool {
try Bcrypt.verify(password, created: self.passwordHash)
}
}
func routes(_ app: Application) throws {
let terproteksi = app.grouped(Pengguna.authenticator(), Pengguna.guardMiddleware())
terproteksi.get("profil") { req -> String in
let pengguna = try req.auth.require(Pengguna.self)
return "Halo, \(pengguna.email)"
}
}
Praktikum
Buat route group terproteksi dengan Pengguna.authenticator() dan Pengguna.guardMiddleware(), lalu tambahkan route GET "pesanan-saya" yang mengambil pengguna teraut lewat req.auth.require(Pengguna.self) dan mengembalikan "Pesanan milik <email>".
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Jangan pernah menyimpan password mentah di kolom database — selalu hash lewat Bcrypt.hash(password) sebelum disimpan, dan bandingkan lewat Bcrypt.verify saat login, bukan membandingkan string secara langsung.