Study
Vapor

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>".

Editor Latihan

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.