มิดเดิลแวร์และการยืนยันตัวตน
เพิ่มตรรกะร่วมและปกป้องเส้นทาง
มิดเดิลแวร์และการยืนยันตัวตน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดเส้นทางและจัดการคำขอ
- การเข้ารหัสเนื้อหาและ JSON
- ORM และโมเดลแบบ Fluent
- มิดเดิลแวร์และการยืนยันตัวตน