غالبًا ما تكون مصادقة مستخدمي تطبيق الويب أمرًا ضروريًا، وعادةً ما تتطلب برمجة خاصة في تطبيقك. بالنسبة إلى تطبيقات Google Cloud Platform، يمكنك توزيع هذه المسؤوليات على خدمة Identity-Aware Proxy. إذا كنت تحتاج فقط إلى تقييد الوصول إلى مستخدمين محددين، فلن تكون هناك تغييرات ضرورية للتطبيق. إذا كان التطبيق يحتاج إلى معرفة هوية المستخدم (مثل الحفاظ على الإعدادات المفضّلة للمستخدم من جانب الخادم)، يمكن أن يزوّد خادم Identity-Aware Proxy بهذا الحد الأدنى من رمز التطبيق.
ما المقصود بالخادم الوكيل للهوية؟
Identity-Aware Proxy (IAP) هي خدمة من Google Cloud Platform تعترض طلبات الويب المرسَلة إلى تطبيقك وتصادق المستخدم الذي يقدِّم الطلب باستخدام خدمة Google Identity ولا تسمح للطلبات إلا إذا كانت واردة من مستخدم مفوّض منك. بالإضافة إلى ذلك، يمكنه تعديل رؤوس الطلبات لتضمين معلومات حول المستخدم الذي تمت مصادقته.
سوف يرشدك هذا الدرس التطبيقي إلى خطوات إنشاء تطبيقك الخاص، وتقييد الوصول إليه، والحصول على هوية المستخدم من الشراء داخل التطبيق.
البنية التي ستنشئها
في هذا الدرس التطبيقي حول الترميز، ستنشئ تطبيق ويب بسيطًا باستخدام Google App Engine، ثم تستكشف طرقًا مختلفة لاستخدام Identity-Aware Proxy لتقييد الوصول إلى التطبيق وتوفير معلومات هوية المستخدم له. سيعمل تطبيقك على:
|
ما ستتعرّف عليه
- كيفية كتابة تطبيق App Engine بسيط باستخدام Python 3.7
- كيفية تفعيل الشراء داخل التطبيق وتقييده لحظر الوصول إلى التطبيق
- كيفية الحصول على معلومات هوية المستخدم من الشراء داخل التطبيق في تطبيقك
- كيفية التحقّق من صحة المعلومات من الشراء داخل التطبيق من خلال التشفير للحماية من الانتحال
المتطلبات اللازمة
- متصفح ويب حديث مثل Chrome.
- معرفة أساسية بلغة البرمجة Python
يركّز هذا الدرس التطبيقي على الترميز Google App Engine والشراء داخل التطبيق. يتم معقل المفاهيم وقوالب الرموز غير ذات الصلة وتوفيرها لك لنسخها ولصقها.
ستعمل في بيئة سطر أوامر Cloud Shell. ابدأ بفتح هذه البيئة واستحضر نموذج الرمز إليها.
إطلاق Cloud Console وCloud Console
في أعلى يمين الصفحة الاختبارية، انقر على الزر "فتح Google Console". وسيكون عليك تسجيل الدخول باسم المستخدم وكلمة المرور الموضحين أسفل ذلك الزر. |
سيتم تنفيذ كل الأوامر في هذا الدرس التطبيقي حول الترميز داخل Cloud Shell للمشروع الذي تم إنشاؤه وفتحه. افتح Cloud Shell بالنقر على رمز "تفعيل Cloud Shell" في يسار عنوان صفحة وحدة التحكُّم. يسمح لك النصف السفلي من الصفحة بإدخال الأوامر وتشغيلها. يمكن تشغيل الأوامر من الكمبيوتر الشخصي، ولكن يجب تثبيت برامج التطوير اللازمة وإعدادها أولاً. يتضمن Cloud Shell كل أدوات البرامج التي تحتاجها. |
تنزيل الرمز
انقر على منطقة سطر الأوامر في Cloud Shell حتى تتمكن من كتابة الأوامر. يمكنك جلب الرمز من Github ثم التغيير إلى مجلد الرمز:
git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd iap-codelab
يحتوي هذا المجلد على مجلد فرعي واحد لكل خطوة من هذا الدرس التطبيقي حول الترميز. وستنتقل إلى المجلد الصحيح لتنفيذ كل خطوة.
وهو تطبيق عادي من App Engine مكتوب في Python 3.7 يعرض فقط صفحة الترحيب "مرحبًا بك في العالم". وسننشره ونختبره ثم نحظر الوصول إليه باستخدام ميزة الشراء داخل التطبيق.
مراجعة رمز التطبيق
يمكنك التغيير من مجلد المشروع الرئيسي إلى مجلد 1-HelloWorld
الفرعي الذي يحتوي على رمز لهذه الخطوة.
cd 1-HelloWorld
يوجد رمز التطبيق في ملف main.py
. ويستخدم إطار العمل Flask على الويب للرد على طلبات الويب باستخدام محتوى نموذج. ملف النموذج هذا بتنسيق templates/index.html
، وتتضمّن هذه الخطوة نص HTML عاديًا فقط. يحتوي ملف نموذج ثانٍ على نموذج هيكل عظمي لسياسة الخصوصية في templates/privacy.html
.
هناك ملفان آخران: يعرض requirements.txt
جميع مكتبات Python غير التلقائية التي يستخدمها التطبيق، بينما يُعلم app.yaml
Google Cloud Platform أنّ هذا تطبيق Python 3.7 App Engine.
يمكنك إدراج كل ملف في واجهة المستخدم باستخدام الأمر cat، كما في:
cat main.py
أو يمكنك فتح محرِّر رمز Cloud Shell من خلال النقر على رمز القلم الرصاص في أعلى يسار نافذة Cloud Shell، وفحص الرمز بهذه الطريقة.
لا تحتاج إلى تغيير أي ملفات لهذه الخطوة.
النشر على App Engine
نشر التطبيق الآن إلى بيئة App Engine Standard لـ Python 3.7
gcloud app deploy
قد يُطلب منك اختيار منطقة للنشر فيها. اختَر أي متجر بالقرب منك يفيد بأنّه &يتوافق مع "المعايير العادية"؛ عند سؤالك عما إذا كنت تريد المتابعة، أدخِل Y
نعم.
من المفترض أن يكتمل النشر خلال بضع دقائق وستظهر رسالة تفيد بأنه يمكنك عرض تطبيقك باستخدام gcloud app browse
. أدخِل هذا الطلب. إذا لم يتم فتح علامة تبويب جديدة في المتصفح، انقر على الرابط المعروض لفتحها في علامة تبويب جديدة، أو انسخها إلى علامة تبويب جديدة يتم فتحها يدويًا إذا لزم الأمر. نظرًا لأن هذه هي المرة الأولى التي يتم فيها تشغيل هذا التطبيق، سيستغرق الأمر بضع ثوانٍ حتى يظهر عند بدء مثيل السحابة الإلكترونية، ومن المفترض أن تظهر لك النافذة التالية.
يمكنك فتح عنوان URL نفسه من أي جهاز كمبيوتر متصل بالإنترنت لمشاهدة صفحة الويب هذه. الوصول غير محدود بعد.
تقييد الوصول باستخدام الشراء داخل التطبيق
في نافذة Cloud Console، انقر على رمز القائمة في أعلى يمين الصفحة، ثم انقر على "الأمان"، ثم على "خادم وكيل الوصول إلى الهوية". | |
بما أن هذه هي المرة الأولى التي تفعِّل فيها أحد خيارات المصادقة لهذا المشروع، ستظهر لك رسالة تفيد بأنه يجب عليك إعداد شاشة موافقة OAuth حتى تتمكن من استخدام الشراء داخل التطبيق. | |
انقر على الزر "ضبط الموافقة على الشاشة". سيتم فتح علامة تبويب جديدة لضبط شاشة طلب الموافقة. |
املأ الفراغات المطلوبة بالقيم المناسبة:
اسم التطبيق | مثال على الشراء داخل التطبيق |
البريد الإلكتروني للحصول على الدعم | عنوان بريدك الإلكتروني. ربما يكون مُملوءًا من قبل. |
النطاق المفوَّض | جزء اسم المضيف الخاص بعنوان URL للتطبيق، مثل iap-example-999999.appspot.com. يمكنك الاطّلاع على هذا في شريط العناوين بصفحة Hello World التي فتحتها سابقًا. يجب عدم تضمين رمز البداية يجب الضغط على Enter بعد ملء هذه القيمة. |
رابط الصفحة الرئيسية للتطبيق | عنوان URL الذي استخدمته لعرض تطبيقك |
رابط سياسة خصوصية التطبيق | رابط صفحة الخصوصية في التطبيق، تمامًا مثل رابط الصفحة الرئيسية مع إضافة /privacy إلى النهاية |
انقر على حفظ. سيُطلب منك إنشاء بيانات اعتماد. لا تحتاج إلى إنشاء بيانات اعتماد لهذا الدرس التطبيقي، حتى تتمكن من إغلاق علامة تبويب المتصفح هذه.
ارجع إلى صفحة Identity-Aware Proxy وحدِّثها. من المفترض أن تظهر لك الآن قائمة بالموارد التي يمكنك حمايتها. انقر على زر التبديل في عمود الشراء داخل التطبيق في صف تطبيق App Engine لتفعيل الشراء داخل التطبيق. | |
ستظهر لك أسماء النطاقات التي ستتم حمايتها من خلال الشراء داخل التطبيق. انقر على "تفعيل". | |
الآن افتح علامة تبويب المتصفح وانتقل إلى عنوان URL لتطبيقك. وسيتم عرض شاشة "تسجيل الدخول باستخدام حساب Google" التي تطلب منك تسجيل الدخول للوصول إلى التطبيق. | |
سجِّل الدخول باستخدام حساب Google أو G Suite. ستظهر شاشة تمنعك من الوصول. |
لقد تمت حماية تطبيقك بنجاح من خلال الشراء داخل التطبيق، ولكنك لم تحدد بعد الشراء الحسابات المسموح بها من أجل الشراء.
ارجع إلى صفحة Identity-Aware Proxy لوحدة التحكّم، وحدّد مربّع الاختيار بجوار تطبيق App Engine، واطّلع على الشريط الجانبي على يسار الصفحة. | |
يجب إضافة كل عنوان بريد إلكتروني (أو عنوان مجموعة على Google أو اسم نطاق G Suite) يجب السماح بالوصول إليه كعضو. انقر على "إضافة عضو". أدخِل عنوان بريدك الإلكتروني، ثم اختَر دور مستخدم تطبيق الويب في السحابة الإلكترونية للشراء داخل التطبيق أو الشراء داخل التطبيق الذي تريد تخصيصه لهذا العنوان. يمكنك إدخال المزيد من العناوين أو نطاقات G Suite بالطريقة نفسها. |
انقر على "حفظ". ستظهر الرسالة عبر البريد الإلكتروني،&الرسالة لمعرفة السياسة المحدَّدة&في أسفل النافذة.
انتقِل مرة أخرى إلى تطبيقك وأعِد تحميل الصفحة. من المفترض أن يظهر لك الآن تطبيق الويب لأنك سجّلت الدخول من قبل عن طريق مستخدم فوضته. ومع ذلك، قد تستمر في رؤية صفحة "&&ليس لديك"؛ لأنّ لديك صفحة للوصول إلى هذه المعلومات لأن عملية الشراء داخل التطبيق قد لا تراجِع تفويضك. وفي هذه الحالة، اتّبِع الخطوات التالية:
- افتح متصفّح الويب على عنوان الصفحة الرئيسية مع إضافة
/_gcp_iap/clear_login_cookie
إلى نهاية عنوان URL، كما هو الحال فيhttps://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie
. - ستظهر لك شاشة جديدة لتسجيل الدخول باستخدام حساب Google، حيث يتم عرض حسابك. لا تنقر على الحساب. بدلاً من ذلك، انقر على "استخدام حساب آخر"، وأعد إدخال بيانات الاعتماد.
- تؤدي هذه الخطوات إلى إعادة الشراء داخل التطبيق لإعادة الدخول ومن المفترض أن تظهر لك الشاشة الرئيسية للتطبيق.
إذا كنت تستطيع الوصول إلى متصفح آخر أو يمكنك استخدام وضع التصفح المتخفي في متصفحك، وكان لديك حساب آخر صالح في GMail أو G Suite، يمكنك استخدام هذا المتصفح للانتقال إلى صفحة التطبيق وتسجيل الدخول باستخدام الحساب الآخر. ونظرًا لعدم تفويض هذا الحساب، ستظهر له شاشة "&&ليس لديك"'t لا تمتلك إذن دخول &العرض بدلاً من تطبيقك.
بعد حماية التطبيق باستخدام الشراء داخل التطبيق، يمكن له استخدام معلومات الهوية التي تقدمها الشراء داخل عناوين طلب الويب التي يمر عليها. في هذه الخطوة، سيحصل التطبيق على عنوان البريد الإلكتروني للمستخدم الذي سجّل الدخول ومعرّف المستخدم الفريد المستمر الذي يتم تخصيصه من خلال خدمة Google Identity لهذا المستخدم. سيتم عرض هذه البيانات للمستخدم في صفحة الترحيب.
هذه هي الخطوة 2، وتنتهي الخطوة الأخيرة بفتح Cloud Shell في مجلد iap-codelab/1-HelloWorld
. يمكنك تغيير المجلد إلى هذه الخطوة:
cd ~/iap-codelab/2-HelloUser
نشر إلى App Engine
وبما أن النشر يستغرق بضع دقائق، ابدأ بنشر التطبيق على بيئة App Engine Standard لـ Python 3.7:
gcloud app deploy
عندما يُطلب منك تحديد ما إذا كنت تريد المتابعة، أدخِل الحرف Y للإجابة. من المفترض أن تكتمل عملية النشر في بضع دقائق. أثناء انتظارك، يمكنك فحص ملفات التطبيق كما هو موضّح أدناه.
عندما تكون عملية النشر جاهزة، ستظهر لك رسالة تفيد بأنه يمكنك عرض تطبيقك باستخدام gcloud app browse
. أدخِل هذا الطلب. إذا كانت هناك علامة تبويب جديدة لا تفتح على المتصفح، انسخ الرابط المعروض وافتحه في علامة تبويب جديدة بشكل طبيعي. من المفترض أن تظهر صفحة مشابهة لما يلي:
قد تحتاج إلى الانتظار لبضع دقائق حتى يحل الإصدار الجديد من تطبيقك محل الإصدار السابق. أعِد تحميل الصفحة إذا لزم الأمر لعرض صفحة مشابهة لما ورد أعلاه.
فحص ملفات التطبيق
يحتوي هذا المجلد على مجموعة الملفات نفسها كما تظهر في الخطوة 1، ولكن تم تغيير ملفين من الملفين: main.py
وtemplates/index.html
. وتم تغيير البرنامج لاسترداد معلومات المستخدم التي يقدّمها الشراء داخل التطبيق في عناوين الطلبات، ويعرض النموذج الآن هذه البيانات.
هناك سطران في main.py
يحصلان على بيانات الهوية التي يوفرها الشراء داخل التطبيق:
user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')
تُقدّم عمليات الشراء داخل التطبيق عناوين X-Goog-Authenticated-User-
، وتكون الأسماء غير حساسة لحالة الأحرف، لذا يمكن منحها بأحرف صغيرة أو بأحرف كبيرة بالكامل إذا كان ذلك ممكنًا. تتضمن عبارة display_template الآن هذه القيم حتى يمكن عرضها:
page = render_template('index.html', email=user_email, id=user_id)
يمكن أن يعرض نموذج index.html هذه القيم عن طريق تضمين الأسماء بين أقواس متعرجة مزدوجة:
Hello, {{ email }}! Your persistent ID is {{ id }}.
كما ترى، تأتي البيانات المقدمة مسبوقة بـ accounts.google.com
: تعرض مصدر المعلومات. يمكن أن يزيل تطبيقك كل البيانات بما في ذلك النقطتين الرأسيتين للحصول على القيم الأولية إذا كنت ترغب في ذلك.
إيقاف الشراء داخل التطبيق
ماذا يحدث لهذا التطبيق في حال إيقاف الشراء داخل التطبيق أو تجاوزه بطريقة ما (مثل التطبيقات الأخرى التي تعمل في مشروعك على السحابة الإلكترونية نفسه)؟ يمكنك إيقاف الشراء داخل التطبيق للاطّلاع على المزيد من المعلومات.
في نافذة Cloud Console، انقر على رمز القائمة في أعلى يمين الصفحة، ثم انقر على "الأمان"، ثم على "خادم وكيل الوصول إلى الهوية". انقر على مفتاح تبديل الشراء داخل التطبيق بجانب تطبيق App Engine لإيقاف الشراء داخل التطبيق. |
سيتم تحذيرك من أن ذلك سيسمح لجميع المستخدمين بالوصول إلى التطبيق.
أعِد تحميل صفحة الويب للتطبيق. من المفترض أن تظهر الصفحة ذاتها، ولكن بدون أي معلومات للمستخدم:
وبما أن التطبيق غير محمي الآن، يمكن للمستخدم إرسال طلب ويب يبدو أنه اجتاز عملية الشراء داخل التطبيق. على سبيل المثال، يمكنك تشغيل أمر curl التالي من Cloud Shell لإجراء ذلك (استبدال <your-url-here> بعنوان URL الصحيح لتطبيقك):
curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"
وسيتم عرض صفحة الويب في سطر الأوامر، بالشكل التالي:
<!doctype html> <html> <head> <title>IAP Hello User</title> </head> <body> <h1>Hello World</h1> <p> Hello, totally fake email! Your persistent ID is None. </p> <p> This is step 2 of the <em>User Authentication with IAP</em> codelab. </p> </body> </html>
لا توجد طريقة للتطبيق لمعرفة أنه تم إيقاف الشراء داخل التطبيق أو تجاوزه. وبالنسبة إلى الحالات التي تمثل خطرًا محتملاً، تعرض الخطوة 3 حلاً.
إذا كان هناك خطر من إيقاف الشراء داخل التطبيق أو تجاوزه، يمكن لتطبيقك التحقق للتأكد من صحة معلومات الهوية التي يتلقاها. يستخدم هذا عنوان طلب الويب الثالث الذي تمت إضافته بواسطة الشراء داخل التطبيق باسم X-Goog-IAP-JWT-Assertion
. وقيمة العنوان هي عبارة عن كائن مشفر موقّع يحتوي أيضًا على بيانات هوية المستخدم. يمكن لتطبيقك التحقّق من التوقيع الرقمي واستخدام البيانات المقدَّمة في هذا العنصر للتأكّد من أنه تم تقديمها من خلال الشراء داخل التطبيق بدون تغيير.
يتطلب إثبات صحة التوقيع الرقمي عدة خطوات إضافية، مثل استرداد أحدث مجموعة من مفاتيح Google العامة. يمكنك تحديد ما إذا كان تطبيقك بحاجة إلى هذه الخطوات الإضافية استنادًا إلى المخاطر التي من الممكن أن يتمكن شخص من إيقاف الشراء داخل التطبيق أو تجاوزه وحساسية التطبيق.
هذه هي الخطوة 3، وتنتهي الخطوة الأخيرة بفتح Cloud Shell في مجلد iap-codelab/2-HelloUser
. يمكنك تغيير المجلد إلى هذه الخطوة:
cd ~/iap-codelab/3-HelloVerifiedUser
النشر على App Engine
نشر التطبيق في بيئة App Engine Standard للإصدار Python 3.7:
gcloud app deploy
عندما يُطلب منك تحديد ما إذا كنت تريد المتابعة، أدخِل الحرف Y للإجابة. من المفترض أن تكتمل عملية النشر في بضع دقائق. أثناء انتظارك، يمكنك فحص ملفات التطبيق كما هو موضّح أدناه.
عندما تكون عملية النشر جاهزة، ستظهر لك رسالة تفيد بأنه يمكنك عرض تطبيقك باستخدام gcloud app browse
. أدخِل هذا الطلب. إذا كانت هناك علامة تبويب جديدة لا تفتح على المتصفح، انسخ الرابط المعروض وافتحه في علامة تبويب جديدة بشكل طبيعي.
تذكر أنك أوقفت الشراء داخل التطبيق في الخطوة 2، لذلك لا يتم توفير بيانات الشراء داخل التطبيق للتطبيق. من المفترض أن تظهر صفحة مشابهة لما يلي:
كما في السابق، قد تحتاج إلى الانتظار لبضع دقائق قبل أن يتم نشر الإصدار الأحدث لرؤية النسخة الجديدة من الصفحة.
نظرًا لإيقاف الشراء داخل التطبيق، لا تتوفر معلومات المستخدم. الآن أعد تشغيل الشراء داخل التطبيق.
في نافذة Cloud Console، انقر على رمز القائمة في أعلى يمين الصفحة، ثم انقر على "الأمان"، ثم على "خادم وكيل الوصول إلى الهوية". انقر على مفتاح تبديل الشراء داخل التطبيق بجوار تطبيق App Engine لتفعيل الشراء داخل التطبيق مرة أخرى. |
إعادة تحميل الصفحة من المفترض أن تظهر الصفحة على النحو التالي:
يُرجى العلم أنّ عنوان البريد الإلكتروني المقدَّم من خلال طريقة إثبات الملكية لا يتضمّن البادئة accounts.google.com:
.
في حالة إيقاف الشراء داخل التطبيق أو تجاوزه، ستكون البيانات التي تم التحقق منها إما مفقودة أو غير صالحة، حيث لا يمكن أن يكون لها توقيع صالح ما لم يتم إنشاؤه بواسطة مالك مفاتيح Google الخاصة.
فحص ملفات التطبيق
يحتوي هذا المجلد على نفس مجموعة الملفات كما هو موضح في الخطوة 2، مع تغيير ملفين وملف واحد جديد. الملف الجديد هو auth.py
، والذي يوفّر طريقة user()
لاسترداد معلومات الهوية الموقَّعة تشفيرًا والتحقق منها. ملاحظة: الملفات التي تم تغييرها هي main.py
وtemplates/index.html
، وهما يستخدمان الآن نتائج تلك الطريقة. يتم أيضًا عرض العناوين التي لم يتم التحقّق منها، كما هو موضّح في الخطوة 2، للمقارنة.
تتمثل الوظيفة الجديدة بشكل أساسي في دالة user()
:
def user():
assertion = request.headers.get('X-Goog-IAP-JWT-Assertion')
if assertion is None:
return None, None
info = jwt.decode(
assertion,
keys(),
algorithms=['ES256'],
audience=audience()
)
return info['email'], info['sub']
assertion
هي البيانات الموقَّعة مشفّرة في عنوان الطلب المحدد. ويستخدم الرمز مكتبة للتحقّق من صحة هذه البيانات وفك تشفيرها. وتستخدِم عملية التحقّق هذه المفاتيح العامة التي تقدّمها Google للتحقُّق من البيانات التي توقِّعها، ومعرفة الجمهور الذي تم إعداد البيانات له (يمثّل بالضرورة مشروع Google Cloud المحمي). تجمع الدوال المساعدة keys()
وaudience()
تلك القيم وتعرضها.
يحتوي الكائن الموقَّع على نوعين من البيانات التي نحتاجها: عنوان البريد الإلكتروني الذي تم إثبات ملكيته، وقيمة المعرّف الفريد (الواردة في الحقل sub
للمشترك في الحقل العادي).
وتكمل هذه الخطوة الخطوة 3.
لقد نشرت تطبيق ويب App Engine. في الخطوة الأولى، حصرت إمكانية وصول التطبيق على المستخدمين الذين اخترتهم فقط. في الخطوة 2، استرجعت وعرضت هوية المستخدمين التي سمحت الشراء داخل التطبيق بالدخول إلى تطبيقك، ولاحظت احتمال انتحال هذه المعلومات إذا تم إيقاف الشراء داخل التطبيق أو تجاوزه. في الخطوة الثالثة، تحققت من صحة التأكيدات المشفرة بهوية المستخدم، والتي لا يمكن انتحالها.
موارد Google Cloud Platform الوحيدة التي استخدمتها في هذا الدرس التطبيقي هي أمثلة App Engine. وفي كل مرة تنشر فيها التطبيق، يتم إنشاء نسخة جديدة ويستمر وجودها حتى يتم حذفها. اخرج من الدرس التطبيقي لحذف المشروع وجميع الموارد المتاحة فيه.