0Pricing
Swift Academy · درس

البرمجيات الوسيطة والمصادقة

أضف منطقًا مشتركًا واحمِ المسارات.

البرمجيات الوسيطة والمصادقة درس مجاني في 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التوجيه ومعالجة الطلبات
  2. ترميز المحتوى وJSON
  3. ‏ORM والنماذج في Fluent
  4. البرمجيات الوسيطة والمصادقة
← العودة إلى Swift Academy