البرمجيات الوسيطة والمصادقة
أضف منطقًا مشتركًا واحمِ المسارات.
البرمجيات الوسيطة والمصادقة درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
ما هي Middleware؟
تقع Middleware بين الطلب الوارد ومعالج المسار، ويمكنها فحص الطلب والاستجابة أو تعديلهما. وهي مناسبة تمامًا للتسجيل وCORS ومعالجة الأخطاء والمصادقة.
import Vaporبروتوكول Middleware
تتوافق Middleware مخصصة مع 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 عامة
أضيفوا Middleware إلى app.middleware لتعمل مع كل طلب. الترتيب مهم — إذ تُنفّذ Middleware بالترتيب الذي أُضيفت به.
app.middleware.use(LogMiddleware())Middleware المضمّنة
يأتي Vapor مع Middleware مفيدة: تحوّل ErrorMiddleware الأخطاء المطروحة إلى استجابات، وتخدم FileMiddleware الملفات الثابتة، وتتولى CORSMiddleware الطلبات عبر المصادر.
let cors = CORSMiddleware(configuration: .default())
app.middleware.use(cors)Middleware الخاصة بمسارات محددة
طبّقوا Middleware على بعض المسارات فقط من خلال تجميعها معها. تكون المسارات داخل المجموعة محمية، بينما لا تكون المسارات الأخرى كذلك.
let protected = app.grouped(LogMiddleware())
protected.get("dashboard") { req in "Secret dashboard" }مفاهيم المصادقة
يتكوّن نظام المصادقة في Vapor من جزأين: نموذج Authenticatable (المستخدم الخاص بكم)، وMiddleware من نوع 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() {}
}كتابة 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) // trueحماية المسارات باستخدام Guard
ادمجوا Authenticator مع 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
}مصادقة الرموز المميّزة
تُعد رموز Bearer المميّزة شائعة الاستخدام في واجهات API. يتوافق نموذج الرمز مع 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.
الأسئلة الشائعة
هل درس «البرمجيات الوسيطة والمصادقة» مجاني؟
نعم — نص درس «البرمجيات الوسيطة والمصادقة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «البرمجيات الوسيطة والمصادقة»؟
أضف منطقًا مشتركًا واحمِ المسارات. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «البرمجيات الوسيطة والمصادقة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التوجيه ومعالجة الطلبات
- ترميز المحتوى وJSON
- ORM والنماذج في Fluent
- البرمجيات الوسيطة والمصادقة