0Pricing
Swift Academy · บทเรียน

มิดเดิลแวร์และการยืนยันตัวตน

เพิ่มตรรกะร่วมและปกป้องเส้นทาง

มิดเดิลแวร์และการยืนยันตัวตน เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

มิดเดิลแวร์คืออะไร

มิดเดิลแวร์อยู่ระหว่างคำขอที่เข้ามากับตัวจัดการเส้นทาง และสามารถตรวจสอบหรือแก้ไขทั้งคำขอและการตอบกลับได้ จึงเหมาะอย่างยิ่งสำหรับการบันทึกเหตุการณ์, CORS, การจัดการข้อผิดพลาด และการยืนยันตัวตน

import Vapor

โพรโทคอลมิดเดิลแวร์

มิดเดิลแวร์ที่กำหนดเองต้องสอดคล้องกับ 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)
    }
}

การลงทะเบียนมิดเดิลแวร์ทั่วทั้งแอป

เพิ่มมิดเดิลแวร์ลงใน app.middleware เพื่อให้ทำงานกับทุกคำขอ ลำดับมีความสำคัญ เพราะมิดเดิลแวร์จะทำงานตามลำดับที่เพิ่มเข้าไป

app.middleware.use(LogMiddleware())

มิดเดิลแวร์ในตัว

Vapor มีมิดเดิลแวร์ที่เป็นประโยชน์ให้ใช้ ได้แก่ ErrorMiddleware ซึ่งแปลงข้อผิดพลาดที่ถูกส่งเป็นการตอบกลับ FileMiddleware ซึ่งให้บริการไฟล์แบบคงที่ และ CORSMiddleware ซึ่งจัดการคำขอข้ามแหล่งที่มา

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

มิดเดิลแวร์เฉพาะเส้นทาง

ใช้มิดเดิลแวร์กับเส้นทางเพียงบางส่วนได้โดยจัดกลุ่มเส้นทางร่วมกับมิดเดิลแวร์นั้น เส้นทางภายในกลุ่มจะได้รับการปกป้อง ส่วนเส้นทางอื่นจะไม่ได้รับการปกป้อง

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

แนวคิดเกี่ยวกับการยืนยันตัวตน

ระบบการยืนยันตัวตนของ Vapor มีสองส่วน ได้แก่ โมเดลที่ยืนยันตัวตนได้ (ผู้ใช้ของคุณ) และมิดเดิลแวร์ตรวจสอบตัวตนที่ตรวจสอบข้อมูลรับรองและจัดเก็บผู้ใช้ไว้ในคำขอ

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() {}
}

การเขียนตัวตรวจสอบสิทธิ์แบบพื้นฐาน

AsyncBasicAuthenticator จัดการการยืนยันตัวตนแบบพื้นฐานของ HTTP ใช้ 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 ให้ใช้สำหรับแฮชเมื่อสมัครสมาชิกและตรวจสอบเมื่อ login การแฮชเป็นการทำงานทางเดียว การตรวจสอบจะเปรียบเทียบค่าที่ผู้ใช้ส่งมากับแฮชที่จัดเก็บไว้

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

การปกป้องเส้นทางด้วยตัวป้องกัน

ผสานตัวตรวจสอบสิทธิ์เข้ากับ 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
}

การยืนยันตัวตนด้วยโทเค็น

สำหรับส่วนติดต่อโปรแกรมประยุกต์ โทเค็นแบบผู้ถือเป็นสิ่งที่ใช้กันทั่วไป แบบจำลองโทเค็นจะสอดคล้องกับ ModelTokenAuthenticatable ทำให้ Vapor ตรวจสอบส่วนหัว Authorization: Bearer ... และโหลดผู้ใช้ที่เกี่ยวข้องโดยอัตโนมัติ

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

ตรวจสอบความเข้าใจ: มิดเดิลแวร์และการยืนยันตัวตน

โปรดยืนยันความเข้าใจของคุณ

ทบทวน: มิดเดิลแวร์และการยืนยันตัวตน

คุณได้เรียนรู้วิธีดักรับคำขอและรักษาความปลอดภัยให้คำขอเหล่านั้น:

  • มิดเดิลแวร์ (AsyncMiddleware) ครอบคำขอ คุณสามารถลงทะเบียนแบบทั่วทั้งแอปหรือเฉพาะกลุ่มเส้นทางได้
  • ใช้สิ่งที่มีมาให้ เช่น ErrorMiddleware และ CORSMiddleware
  • ทำให้ผู้ใช้รองรับ Authenticatable เขียน Authenticator และเรียก req.auth.login
  • แฮชด้วย Bcrypt ป้องกันเส้นทางด้วย guardMiddleware() และอ่านผู้ใช้ผ่าน req.auth.require

คำถามที่พบบ่อย

บทเรียน “มิดเดิลแวร์และการยืนยันตัวตน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “มิดเดิลแวร์และการยืนยันตัวตน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “มิดเดิลแวร์และการยืนยันตัวตน”

เพิ่มตรรกะร่วมและปกป้องเส้นทาง คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “มิดเดิลแวร์และการยืนยันตัวตน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดเส้นทางและจัดการคำขอ
  2. การเข้ารหัสเนื้อหาและ JSON
  3. ORM และโมเดลแบบ Fluent
  4. มิดเดิลแวร์และการยืนยันตัวตน
← กลับไปที่ Swift Academy