مصادقة المستخدم لتطبيقات الويب و iOS مع AWS Cognito (الجزء 1)
نشرت: 2022-03-10على مر السنين ، قمت ببناء ثلاثة أنظمة لإدارة المستخدمين على الأقل من البداية. يمكن أن يعتمد الكثير من النهج على نموذج معياري ، ولكن هناك دائمًا عدد قليل من العناصر الأساسية التي تحتاج إلى تخصيصها لعميل معين. يعد هذا مصدر قلق كافٍ لأن فئة كاملة من خدمات إدارة المستخدمين والمصادقة والتفويض قد ظهرت لتلبية هذه الحاجة. خدمات مثل Auth0 لها حلول كاملة تعتمد على إدارة المستخدم والهوية التي يمكن للمطورين التكامل معها.
إحدى الخدمات التي توفر هذه الوظيفة هي خدمة Amazon Web Services (AWS) Cognito. Cognito هو أداة لتمكين المستخدمين من التسجيل وتسجيل الدخول إلى تطبيقات الويب والجوال التي تقوم بإنشائها. بالإضافة إلى هذه الوظيفة ، فإنه يسمح أيضًا بتخزين بيانات المستخدم في وضع عدم الاتصال ، ويوفر مزامنة هذه البيانات. كما تقول Amazon ، "باستخدام Amazon Cognito ، يمكنك التركيز على إنشاء تجارب تطبيقات رائعة بدلاً من القلق بشأن إنشاء حل وتأمينه وتوسيع نطاقه للتعامل مع إدارة المستخدم والمصادقة والمزامنة عبر الأجهزة."
التقليل من الدوارات
لا تستحق الدوارات حقًا السمعة السيئة التي اكتسبتها على مر السنين. يمكن أن تثبت فعاليتها وتأتي بأشكال وأحجام عديدة. اقرأ مقالًا ذا صلة ←
في العام الماضي ، قدمت أمازون إضافة إلى خدمة Cognito الخاصة بها ، وهي تجمعات مستخدمين مخصصة. توفر هذه الوظيفة الآن ما أحتاجه أنا والمطورون الآخرون من أجل الحصول على نظام إدارة مستخدم كامل وقابل للتخصيص عبر الأنظمة الأساسية ، مع المرونة اللازمة لتناسب معظم حالات الاستخدام. لفهم السبب ، نحتاج إلى إلقاء نظرة سريعة على ماهية إدارة المستخدم والمشكلات التي تحلها.

في هذه المقالة ، سنقضي معظم وقتنا في السير خلال عملية تكوين تجمع مستخدمين يلبي احتياجاتنا. بعد ذلك ، سنقوم بدمج تجمع المستخدمين هذا مع تطبيق iOS والسماح للمستخدم بتسجيل الدخول وجلب السمات المرتبطة بحساب المستخدم الخاص به. في النهاية ، سيكون لدينا تطبيق تجريبي محدود ، لكنه يتعامل مع جوهر إدارة المستخدمين. بالإضافة إلى ذلك ، بعد تطبيق ذلك ، ستكون هناك مقالة متابعة تتناول هذا الأمر بشكل أعمق قليلاً.
ماذا نحتاج من إدارة المستخدم؟
إذا كان لديك تطبيق جوال أو ويب ، فما الذي تحتاجه بالضبط من حيث إدارة المستخدم؟ بينما ربما يكون تسجيل دخول المستخدم هو أول ما قد تفكر فيه ، لا يمكننا التوقف عند هذا الحد. إذا كنا نريد نظامًا مرنًا لإدارة المستخدمين من شأنه أن يعمل مع معظم حالات استخدام تطبيقات الويب والجوال ، فسيلزم أن يكون لديه الوظائف التالية:
- اسم المستخدم وكلمة المرور تسجيل الدخول ؛
- تشفير وتخزين كلمات المرور الآمنة ؛
- تغيير كلمة المرور
- سياسة كلمة المرور والتحقق من صحتها ؛
- مشغلات دورة حياة المستخدم (البريد الإلكتروني الترحيبي ، بريد إلكتروني الوداع ، إلخ) ؛
- سمات المستخدم (الاسم الأول ، الاسم الأخير ، إلخ) ؛
- التكوين المطلوب والسمات الاختيارية لكل مستخدم ؛
- التعامل مع كلمات المرور المنسية ؛
- التحقق من صحة رقم الهاتف من خلال الرسائل القصيرة ؛
- تأكيد بواسطة البريد الالكتروني؛
- وصول API إلى نقاط النهاية بناءً على الأذونات ؛
- التخزين الآمن لرمز (رموز) الوصول على الأجهزة المحمولة ؛
- التخزين غير المتصل لسمات المستخدم للأجهزة المحمولة ؛
- مزامنة سمات المستخدم للحالات المتصلة وغير المتصلة ؛
- مصادقة متعددة العوامل.
على الرغم من أن إدارة المستخدم قد تبدو للوهلة الأولى وكأنها نظام تسجيل دخول ، إلا أن الوظيفة يجب أن تتجاوز ذلك بكثير حتى يكون النظام مرنًا بدرجة كافية للتعامل مع معظم حالات الاستخدام. من الواضح أن هذا يتجاوز مجرد اسم مستخدم وكلمة مرور.
يجب استدعاء عنصر إضافي واحد هنا: الأمان. أحد متطلبات أي نظام إدارة مستخدم هو أنه يحتاج إلى التقييم المستمر لأمان النظام ككل. تحتوي العديد من أنظمة إدارة المستخدم المخصصة على ثغرات لم يتم تصحيحها ببساطة. خلال العام الماضي ، كانت هناك انتهاكات أمنية لأنظمة إدارة المستخدمين لشركات مثل Dropbox و Dailymotion و Twitter و Yahoo. إذا اخترت إنشاء حل مخصص ، فأنت على الخطاف لتأمين نظامك.
أدخل Amazon Cognito
Amazon Cognito هي خدمة مُدارة تمكّنك من دمج نظام إدارة مستخدم مرن وقابل للتطوير في تطبيقات الويب والجوّال. يوفر Cognito طريقتين متميزتين للاستفادة من الخدمة: الهويات الموحدة ، والتي تسمح بتسجيل الدخول عبر الشبكات الاجتماعية مثل Facebook ، وتجمعات المستخدمين ، والتي تمنحك إمكانات إدارة مستخدم مخصصة تمامًا لتطبيق معين أو مجموعة من التطبيقات.
تعتبر الهويات الموحدة رائعة إذا كنت تريد أن يتمكن المستخدمون من تسجيل الدخول باستخدام Facebook (أو Google أو Amazon ، وما إلى ذلك) ، ولكن هذا يعني أن جزءًا من عملية إدارة المستخدم سيتم تعهيده إلى Facebook. على الرغم من أن هذا قد يكون مقبولاً في بعض الحالات ، فقد لا يرغب المستخدمون في ربط حساب Facebook الخاص بهم بتطبيقك. بالإضافة إلى ذلك ، قد ترغب في إدارة المزيد من دورة حياة المستخدم مباشرةً ، ولهذا ، فإن الهويات الموحدة ليست مرنة. لغرض مقالة اليوم ، سنركز على مجموعات المستخدمين لأنها توفر المرونة اللازمة لمنصة إدارة مستخدم قوية تناسب معظم حالات الاستخدام. بهذه الطريقة ، سيكون لديك نهج يمكن استخدامه في معظم المشاريع.
نظرًا لأن هذه خدمة AWS ، فهناك فوائد أخرى لاستخدام Cognito. يمكن أن يتكامل Cognito مع API Gateway لتوفير طريقة غير مؤلمة لتفويض الوصول إلى واجهة برمجة التطبيقات استنادًا إلى الرموز المميزة التي يتم إرجاعها من تسجيل الدخول إلى Cognito. بالإضافة إلى ذلك ، إذا كنت تستفيد بالفعل من خدمات AWS الأخرى لتطبيق الهاتف المحمول الخاص بك ، فيمكنك استخدام مجموعة المستخدمين الخاصة بك كموفر هوية لبيانات اعتماد AWS الخاصة بك.
كما هو الحال مع أي خدمة AWS أخرى ، هناك تكلفة متضمنة. يعتمد تسعير Cognito على المستخدمين النشطين شهريًا (MAUs). الخبر السار بالنسبة لمعظم المطورين هو أن هناك فئة مجانية غير محددة يتم تحديدها بحد أقصى 50000 وحدة MAU عند استخدام مجموعة مستخدمين مخصصة. إذا كان لديك تطبيق كبير ، فسوف يمنحك هذا عددًا كبيرًا من المستخدمين لتجربة طريقة جديدة لإدارة المستخدمين. ومع ذلك ، أظن أن العديد منكم لديهم تجارب لن تتجاوز أبدًا 50000 مستخدم. في هذه الحالة ، ستكون إدارة المستخدم الأساسية مجانية إلى حد كبير. الاستثناء الوحيد لذلك هو خدمات AWS الأخرى التي ستستفيد منها كجزء من عملية إدارة المستخدم ، مثل Lambda و SNS و S3.
إنشاء تجمع مستخدمين
تتمثل الخطوة الأولى في دمج مجموعة مستخدمين في تطبيق الهاتف المحمول في إنشاء مجموعة مستخدمي Cognito. سيعطينا هذا قيم التكوين اللازمة للتوصيل في تطبيق المثال الخاص بنا. لإنشاء مجموعة مستخدمين جديدة ، انتقل عبر المعالج المتوفر في وحدة التحكم Cognito في Amazon.
دعنا نتصفح عملية إنشاء تجمع مستخدمين. يجب أن أحذرك من أن هذه عملية طويلة. من نواح كثيرة ، يعد هذا أمرًا جيدًا لأنه يظهر مجالات المرونة. ومع ذلك ، سترغب في تناول فنجان من القهوة والاستمتاع بهذا.
1. الاسم
تتضمن الخطوة الأولى في إنشاء تجمع مستخدمين تحديد اسم لمجموعة المستخدمين الخاصة بك واختيار الأسلوب الذي ستتخذه لإنشاء تجمع المستخدمين. يمكنك إما مراجعة الإعدادات الافتراضية أو "التنقل خلال" الإعدادات. نظرًا لأننا نرغب في الحصول على معرفة عملية جيدة بكيفية تكوين تجمع المستخدمين ، حدد الخيار "خطوة من خلال الإعدادات".

2. السمات
سيتطلب تكوين السمات القليل من التفكير. لكل مجموعة مستخدمين ، ستحتاج إلى تحديد السمات التي سيتم تخزينها في النظام وأي منها مطلوبة. نظرًا لأن النظام سيفرض القيم المطلوبة ، لا يمكنك تغيير ذلك باستمرار. أفضل نهج هنا هو تحديد القيم الأساسية فقط هنا كما هو مطلوب. بالإضافة إلى ذلك ، إذا كنت تريد أن يتمكن المستخدمون من تسجيل الدخول باستخدام عنوان بريدهم الإلكتروني ، فتأكد من وضع علامة عليه كاسم مستعار.
إذا كنت تريد تضمين قيم مخصصة ، فستحتاج إلى القيام بذلك هنا أيضًا. سيكون لكل قيمة مخصصة نوع وقواعد تحقق اختيارية وخيار لتكون قابلة للتغيير (قابلة للتغيير) أو غير قابلة للتغيير (غير قابلة للتغيير). هناك حد أقصى يبلغ 25 سمة مخصصة.
أخيرًا ، يجب توضيح نقطة هنا حول أسماء المستخدمين. قيمة اسم المستخدم لكل مستخدم غير قابلة للتغيير (غير قابلة للتغيير). هذا يعني أنه في معظم الحالات ، يكون جعل هذه القيمة التي يتم إنشاؤها تلقائيًا أمرًا منطقيًا. هذا هو سبب وجود قيمة "اسم المستخدم المفضل". إذا كنت تريد للمستخدمين الحصول على قيمة اسم مستخدم يمكنهم تعديلها ، فما عليك سوى وضع علامة على سمة "اسم المستخدم المفضل" كاسم مستعار. إذا كنت تريد للمستخدمين ببساطة تسجيل الدخول باستخدام عناوين بريدهم الإلكتروني ، فتأكد من وضع علامة على سمة "البريد الإلكتروني" على أنها مطلوبة واسم مستعار.
بالنسبة لتطبيقنا التجريبي ، اخترت أن أجعل "البريد الإلكتروني" و "الاسم الأول" و "اسم العائلة" مطلوبين.

3. السياسات
بعد تكوين السمات ، ستتمكن من تكوين السياسات للحساب. السياسة الأولى لتكوينها هي سياسة كلمة المرور. تسمح لك السياسة بتكوين الطول وما إذا كنت تحتاج إلى أرقام أو أحرف خاصة أو أحرف كبيرة أو أحرف صغيرة. سيتم فرض هذه السياسة على كل من كلمات المرور التي يدخلها المستخدمون وكذلك كلمات المرور التي يعينها المسؤولون للمستخدمين.
تتعلق السياسات التالية بتسجيل المستخدم. بالنسبة إلى التطبيق العام ، من المحتمل أن ترغب في السماح للمستخدمين بالتسجيل بأنفسهم. ومع ذلك ، بناءً على نوع التطبيق ، قد ترغب في تقييد التسجيل وجعل النظام مخصصًا للمدعوين فقط. بالإضافة إلى ذلك ، سيتعين عليك تكوين مدى سرعة انتهاء صلاحية هذه الدعوات إذا لم يتم استخدامها.
بالنسبة لتطبيقنا التجريبي ، اخترت استخدام القيم الافتراضية فقط ، باستثناء أنني لا أريد أن يتمكن المستخدمون من التسجيل بأنفسهم. مع وجود هذه القيم في مكانها الصحيح ، يمكننا المضي قدمًا في عمليات التحقق.

4. عمليات التحقق
تتيح لك خطوة التحقق إعداد مصادقة متعددة العوامل ، بالإضافة إلى التحقق من البريد الإلكتروني والهاتف. في حين أن هذه الوظيفة سهلة الإعداد نسبيًا في وحدة التحكم ، لاحظ أنك ستحتاج إلى طلب زيادة الإنفاق لـ AWS SNS إذا كنت تريد إما التحقق من أرقام الهواتف أو استخدام المصادقة متعددة العوامل.
بالنسبة لتطبيقنا التجريبي ، اخترت استخدام القيم الافتراضية فقط.

5. تخصيصات الرسائل
تسمح لك هذه الخطوة بتخصيص رسائل البريد الإلكتروني والرسائل النصية القصيرة التي سيرسلها تجمع المستخدمين لديك ، بالإضافة إلى عناوين البريد الإلكتروني "من" و "الرد على". لغرض تطبيقنا التجريبي ، سأترك القيم الافتراضية هنا وأتابع.

6. العلامات
إذا كنت مستخدمًا جديدًا لـ AWS ، فقد لا تحتاج إلى تحديد أي علامات. ومع ذلك ، في حالة استخدام مؤسستك لـ AWS بانتظام ، توفر العلامات طريقة لتحليل الإنفاق وتعيين الأذونات مع IAM. على سبيل المثال ، تحدد بعض المنظمات علامات لكل بيئة (التطوير ، التدريج ، الإنتاج) وبحسب المشروع.
بغض النظر عما تدخله في هذه الخطوة ، فلن يؤثر ذلك على تطبيقنا التجريبي.

7. الأجهزة
تتيح لك الخطوة التالية تحديد ما إذا كان تجمع المستخدمين سيتذكر أجهزة المستخدم الخاصة بك. هذه خطوة أمان إضافية تتيح لك معرفة الأجهزة التي تم تسجيل الدخول إلى حساب معين بها. هذا له قيمة إضافية عندما تستفيد من المصادقة متعددة العوامل (MFA). إذا تم تذكر الجهاز ، فيمكنك اختيار عدم طلب رمز MFA عند كل تسجيل دخول.

لغرض التطبيق التجريبي ، اخترت تعيين القيمة على "دائمًا".

8. عملاء التطبيق
لكل تطبيق تريد استخدام تجمع المستخدمين له (مثل تطبيق iOS ، تطبيق ويب ، تطبيق Android ، إلخ) ، يجب عليك إنشاء تطبيق. ومع ذلك ، يمكنك العودة وإنشاء هذه بعد إنشاء تجمع المستخدمين ، لذلك ليست هناك حاجة ملحة لإضافة كل هذه حتى الآن.
يحتوي كل تطبيق على العديد من القيم التي يمكنك تكوينها. بالنسبة لهذا التطبيق التجريبي ، سنمنح التطبيق اسمًا ثم نترك القيم الافتراضية. بعد ذلك ، يمكنك تكوين سمات المستخدم التي يمكن لكل تطبيق قراءتها وكتابتها.

يمكنك تعيين القيم التي تريدها في هذه الخطوة ، طالما أن عنوان البريد الإلكتروني واسم العائلة والاسم المعطى كلها قابلة للقراءة والكتابة بواسطة التطبيق. تأكد من النقر فوق الخيار "إنشاء عميل التطبيق" قبل المتابعة.
9. المشغلات
باستخدام المشغلات ، يمكنك استخدام وظائف Lambda لتخصيص عملية دورة حياة المستخدم بالكامل. على سبيل المثال ، إذا كنت تريد فقط أن يتمكن المستخدمون الذين لديهم عنوان بريد إلكتروني من مجال شركتك من التسجيل ، فيمكنك إضافة وظيفة Lambda لمشغل "التسجيل المسبق" لإجراء عملية التحقق هذه ورفض أي طلب اشتراك لا يمر.
بالنسبة لتطبيقنا التجريبي ، لن أقوم بإضافة أي مشغلات.

10. المراجعة
أدرك أن هذا قد يبدو وكأنه عملية طويلة وشاقة. لكن ضع في اعتبارك أن كل خطوة في إنشاء تجمع مستخدمين تتسم بالمرونة التي تسمح للحل بملاءمة المزيد من حالات الاستخدام. والآن بالنسبة للأخبار التي كنت تنتظر سماعها: هذه هي الخطوة الأخيرة.
ما عليك سوى مراجعة الإعدادات للتأكد من تكوينها بشكل صحيح للتطبيق التجريبي. من هذه الشاشة ، يمكنك الرجوع وتعديل أي من الإعدادات السابقة. بمجرد إنشاء تجمع المستخدمين ، لا يمكن تغيير بعض قيم التكوين (مثل السمات المطلوبة).
مع إنشاء مجموعة المستخدمين الجديدة الخاصة بك ، يمكنك الآن المتابعة لدمجهم في نموذج تطبيق iOS باستخدام AWS SDK لنظام iOS.

إعداد تطبيق iOS الخاص بك لمجموعة المستخدمين الخاصة بك
لقد أنشأت نموذجًا لتطبيق iOS يتكامل مع Cognito للسماح للمستخدم بتسجيل الدخول وتسجيل الخروج وإدخال الاسم الأول والأخير وتعيين كلمة مرور. بالنسبة لهذا العرض التوضيحي الأولي ، لم يتم تضمين تسجيل المستخدم ، لذلك استخدمت وحدة التحكم في Cognito لإضافة مستخدم جديد للاختبار.
يمكن العثور على رمز هذا التطبيق في مستودع GitHub الخاص بي.
تكوين التبعيات
يستخدم هذا التطبيق CocoaPods لإدارة التبعيات. في هذه المرحلة ، فإن التبعيات الوحيدة هي الأجزاء المحددة من AWS iOS SDK التي تتعلق بمجموعات مستخدمي Cognito.
(الوصف الكامل لـ CocoaPods خارج نطاق هذه المقالة ، ومع ذلك ، سيساعدك مورد على موقع CocoaPods على البدء ، في حال كان هذا المفهوم جديدًا بالنسبة لك.)
يمكن رؤية محتويات Podfile لهذا التطبيق أدناه:
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '10.0' use_frameworks! target 'CognitoApplication' do pod 'AWSCore', '~> 2.5.5' pod 'AWSCognitoIdentityProvider', '~> 2.5.5' end
بافتراض أن CocoaPods مثبت على جهازك ، يمكنك فقط تشغيل pod install
، وسيتم تثبيت التبعيات الضرورية لك.
تكوين تجمع المستخدمين
الخطوة التالية هي تضمين القيم الخاصة بتجمع المستخدمين وتطبيق العميل. تم تكوين التطبيق التجريبي لاستخدام ملف ، CognitoApplication/CognitoConfig.plist
، لسحب هذه المعلومات منه. يجب تحديد أربع قيم:
-
region
(سلسلة)
هذه هي المنطقة التي أنشأت فيها تجمع المستخدمين الخاص بك. يجب أن يكون هذا هو معرف المنطقة القياسي ، مثلus-east-1
أوap-southeast-1
. -
poolId
(سلسلة نصية)
هذا هو معرف تجمع المستخدمين الذي قمت بإنشائه. -
clientId
(سلسلة)
هذا هو معرف العميل الذي تم تكوينه كجزء من التطبيق الذي قمتclientId
بمجموعة المستخدمين. -
clientSecret
(سلسلة نصية)
هذا هو سر العميل الذي تم تكوينه كجزء من التطبيق الذي قمتclientSecret
المستخدمين.
مع وجود هذا الملف والقيم المناسبة في مكانها الصحيح ، يمكن تشغيل التطبيق التجريبي. في حالة حدوث أي استثناءات أثناء التشغيل ، تأكد من تضمين كل من القيم الأربع الموضحة أدناه وأن الملف موجود في الدليل الصحيح.

plist
(عرض النسخة الكبيرة)تكامل مفوض التطبيق
يحدث جوهر التكامل مع Amazon Cognito في AppDelegate
الخاص بالتطبيق. خطوتنا الأولى هي التأكد من أننا قمنا بإعداد التسجيل واتصلنا بمجموعة المستخدمين الخاصة بنا. كجزء من هذه العملية ، سنقوم بتعيين مندوب AppDelegate
بنا كمفوض لمجموعة المستخدمين. في هذا المثال الأساسي ، يمكننا الاحتفاظ بهذا المنطق في AppDelegate
. بالنسبة للمشاريع الأكبر ، قد يكون من المنطقي التعامل مع هذا في مكان آخر.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // set up logging for AWS and Cognito AWSDDLog.sharedInstance.logLevel = .verbose AWSDDLog.add(AWSDDTTYLogger.sharedInstance) // set up Cognito config self.cognitoConfig = CognitoConfig() // set up Cognito setupCognitoUserPool() return true } func setupCognitoUserPool() { // we pull the needed values from the CognitoConfig object // this just pulls the values in from the plist let clientId:String = self.cognitoConfig!.getClientId() let poolId:String = self.cognitoConfig!.getPoolId() let clientSecret:String = self.cognitoConfig!.getClientSecret() let region:AWSRegionType = self.cognitoConfig!.getRegion() // we need to let Cognito know which region we plan to connect to let serviceConfiguration:AWSServiceConfiguration = AWSServiceConfiguration(region: region, credentialsProvider: nil) // we need to pass it the clientId and clientSecret from the app and the poolId for the user pool let cognitoConfiguration:AWSCognitoIdentityUserPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: clientId, clientSecret: clientSecret, poolId: poolId) AWSCognitoIdentityUserPool.register(with: serviceConfiguration, userPoolConfiguration: cognitoConfiguration, forKey: userPoolID) let pool:AWSCognitoIdentityUserPool = AppDelegate.defaultUserPool() // we need to set the AppDelegate as the user pool's delegate, which will get called when events occur pool.delegate = self }
بعد أن يكون هذا التكوين في مكانه الصحيح ، نحتاج إلى تكوين طرق التفويض لمجموعة المستخدمين. البروتوكول الذي نقوم بتنفيذه هو AWSCognitoIdentityInteractiveAuthenticationDelegate
. سيتم استدعاء هذا المفوض في أي وقت يحتاج فيه المستخدم إلى تسجيل الدخول أو إعادة تعيين كلمة المرور الخاصة به أو تقديم رمز مصادقة متعدد العوامل أو إذا احتجنا إلى استعلام المستخدم عما إذا كان يرغب في تذكر أجهزته. على سبيل المثال ، نحتاج فقط إلى تنفيذ startPasswordAuthentication
و startNewPasswordRequired
:
extension AppDelegate: AWSCognitoIdentityInteractiveAuthenticationDelegate { // This method is called when we need to log into the application. // It will grab the view controller from the storyboard and present it. func startPasswordAuthentication() -> AWSCognitoIdentityPasswordAuthentication { if(self.navigationController == nil) { self.navigationController = self.window?.rootViewController as? UINavigationController } if(self.loginViewController == nil) { self.loginViewController = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as? LoginViewController } DispatchQueue.main.async { if(self.loginViewController!.isViewLoaded || self.loginViewController!.view.window == nil) { self.navigationController?.present(self.loginViewController!, animated: true, completion: nil) } } return self.loginViewController! } // This method is called when we need to reset a password. // It will grab the view controller from the storyboard and present it. func startNewPasswordRequired() -> AWSCognitoIdentityNewPasswordRequired { if (self.resetPasswordViewController == nil) { self.resetPasswordViewController = self.storyboard?.instantiateViewController(withIdentifier: "ResetPasswordController") as? ResetPasswordViewController } DispatchQueue.main.async { if(self.resetPasswordViewController!.isViewLoaded || self.resetPasswordViewController!.view.window == nil) { self.navigationController?.present(self.resetPasswordViewController!, animated: true, completion: nil) } } return self.resetPasswordViewController! } }
أحد الأشياء الرئيسية التي يجب ملاحظتها هو أن كلتا الطريقتين تعيدان وحدة تحكم العرض التي تنفذ بروتوكولًا معينًا. على سبيل المثال ، يقوم LoginViewController
بتنفيذ AWSCognitoIdentityPasswordAuthentication
، والتي لها طريقة واحدة يتم استدعاؤها مع المعلمات اللازمة لتمكين المستخدم من إكمال عملية تسجيل الدخول.
تدفق المصادقة
مع كل هذه الأجزاء في مكانها الصحيح في التطبيق التجريبي ، يمكنك الآن رؤية عملية تسجيل الدخول تعمل من البداية إلى النهاية. يُظهر العرض الرئيسي للتطبيق اسم المستخدم والاسم الأول واسم العائلة للمستخدم. لتحقيق ذلك ، تحدث الخطوات التالية:
- في
AppViewController
، نسمي طريقةfetchUserAttributes
في طريقةviewDidLoad
. إذا لم يقم المستخدم بتسجيل الدخول ، فسيؤدي ذلك إلى بدء عملية تسجيل الدخول. - سيتم تشغيل طريقة
startPasswordAuthentication
فيAppDelegate
. تقوم هذه الطريقة بتحميلLoginViewController
. - يتم استدعاء طريقة
getDetails
الخاصة بـLoginViewController
بواسطة AWS SDK. يتضمن هذا كائنًا يمثل مثيلًا لـAWSTaskCompletionSource
، والذي يمكننا استخدامه للسماح للمستخدم بمحاولة تسجيل الدخول. - عندما يضغط المستخدم على زر "تسجيل الدخول" ، نقوم بتمرير بيانات اعتماد تسجيل الدخول إلى هذا الكائن. سيؤدي هذا بعد ذلك إلى استدعاء التابع
didCompleteStepWithError
، ويمكننا التعامل مع النتيجة وفقًا لذلك. إذا لم يكن هناك خطأ ، فيمكننا استبعاد وحدة التحكم في العرض. - إذا أنشأنا المستخدم في وحدة التحكم ، فستكون لدينا خطوة أخرى للتعامل معها هنا. لأننا أعطينا المستخدم كلمة مرور مؤقتة ، سيحتاج إلى تعيين كلمة مرور أكثر ديمومة. بالإضافة إلى ذلك ، نظرًا لأننا قمنا بتعيين الاسم المحدد واسم العائلة كمعلمات مطلوبة ، نحتاج إلى السماح للمستخدم بإدخالهما أيضًا. سوف تكتشف AWS SDK ذلك وتستدعي طريقة
startNewPasswordRequired
فيAppDelegate
. سيؤدي هذا إلى عرضResetPasswordViewController
وتعيين مثيلAWSTaskCompletionSource
. - يعمل
ResetPasswordViewController
بشكل مماثل تقريبًا لوحدة التحكم فيLoginViewController
. نحتاج ببساطة إلى مطالبة المستخدم بالقيم الصحيحة ثم إرسال هذه القيم. بمجرد اكتمال هذه العملية بنجاح ، فإننا نستبعد وحدة التحكم في العرض. - بمجرد اكتمال عملية تسجيل الدخول بالكامل ، ستقوم SDK بتخزين الرموز المميزة التي تم إرجاعها بواسطة Cognito بشكل آمن. بعد ذلك ، سنقوم أخيرًا باسترداد تفاصيل المستخدم ، ويمكننا استخدامها لملء
AppViewController
باسم مستخدم المستخدم ، والاسم المحدد واسم العائلة.

خاتمة
على الرغم من أن عملية إعداد تجمع المستخدمين قد تحتوي على عدة خطوات ، إلا أنه من السهل التنقل في هذه الخطوات. بالإضافة إلى ذلك ، يجب أن يمنحك مقدار التكوين الممكن الثقة في أنه يمكنه دعم غالبية حالات الاستخدام. في وظيفتي اليومية في Universal Mind ، عملت مع العديد من العملاء الذين ينقلون تطبيقاتهم الحالية للاستفادة من الإمكانات التي يوفرها Cognito لإدارة المستخدم.
بغض النظر عما إذا كنت بحاجة إلى تنفيذ نظام إدارة مستخدم بانتظام ، فهذه أداة يجب أن يتوفر لدى كل مطور ويب وجوال في صندوق الأدوات الخاص بهم . في المقالة التالية في هذه السلسلة ، سنبدأ في استكشاف إمكانات Cognito أكثر قليلاً من خلال تنفيذ تطبيق تجريبي كامل الميزات ينفذ المزيد من حالات استخدام إدارة المستخدم الشائعة.
مع القليل من الممارسة ، يمكنك الذهاب وإثارة إعجاب جميع أصدقائك من خلال إعداد تطبيق جديد يلبي جميع حالات استخدام إدارة المستخدمين هذه في غضون يوم واحد. هذا جيد جدًا لعمل يوم واحد.
الروابط والموارد
- أمازون كوجنيتو
- "موارد المطور" Amazon Cognito
- AWS Mobile SDK
- "برنامج CocoaPods التعليمي لـ Swift: البدء" ، جوشوا جرين ، raywenderlich.com