1. مقدمة
غالبًا ما يكون من الضروري مصادقة مستخدمي تطبيق الويب، وعادةً ما يتطلب ذلك برمجة خاصة في تطبيقك. بالنسبة إلى تطبيقات Google Cloud Platform، يمكنك تفويض هذه المسؤوليات إلى خدمة Identity-Aware Proxy. إذا كنت بحاجة إلى حظر الوصول إلى مستخدمين محدّدين فقط، لن تحتاج إلى إجراء أي تغييرات على التطبيق. إذا كان التطبيق بحاجة إلى معرفة هوية المستخدم (مثل الاحتفاظ بإعدادات المستخدم المفضّلة من جهة الخادم)، يمكن أن توفّر خدمة Identity-Aware Proxy ذلك بأقل قدر من الرمز البرمجي للتطبيق.
ما هي خدمة Identity-Aware Proxy؟
Identity-Aware Proxy (IAP) هي خدمة من Google Cloud Platform تعترض طلبات الويب المُرسَلة إلى تطبيقك، وتصادق على المستخدم الذي يرسل الطلب باستخدام "خدمة هوية Google"، ولا تسمح إلا بمرور الطلبات الواردة من مستخدم سمحت له بذلك. بالإضافة إلى ذلك، يمكنه تعديل عناوين الطلبات لتضمين معلومات عن المستخدم الذي تمّت مصادقته.
سيرشدك هذا الدرس التطبيقي حول الترميز إلى كيفية إنشاء تطبيقك الخاص وحظر الوصول إليه والحصول على هوية المستخدم من خلال خدمة "الشراء داخل التطبيق".
ما ستنشئه
في هذا الدرس التطبيقي حول الترميز، ستنشئ تطبيق ويب بسيطًا باستخدام Google App Engine، ثم ستستكشف طرقًا مختلفة لاستخدام Identity-Aware Proxy من أجل حصر الوصول إلى التطبيق وتزويده بمعلومات هوية المستخدم. سيتم إجراء ما يلي في تطبيقك:
|
|
ما ستتعلمه
- كيفية كتابة تطبيق بسيط على App Engine ونشره باستخدام Python 3.7
- كيفية تفعيل عمليات الشراء داخل التطبيق وإيقافها لحظر الوصول إلى تطبيقك
- كيفية الحصول على معلومات هوية المستخدم من عمليات الشراء داخل التطبيق إلى تطبيقك
- كيفية التحقّق من صحة المعلومات الواردة من عمليات الشراء داخل التطبيق باستخدام التشفير للحماية من الانتحال
المتطلبات
- متصفّح ويب حديث، مثل Chrome
- معرفة أساسية بلغة البرمجة Python
يركّز هذا الدرس التطبيقي حول الترميز على Google App Engine وIAP. يتم تجاهل المفاهيم ومجموعات الرموز غير ذات الصلة، ويتم توفيرها لك لنسخها ولصقها ببساطة.
2. الإعداد
ستعمل في بيئة سطر الأوامر في Cloud Shell. ابدأ بفتح هذه البيئة واسترداد الرمز النموذجي إليها.
تشغيل وحدة التحكّم وCloud Shell
في أعلى يمين صفحة المختبر، انقر على الزر "فتح Google Console". سيكون عليك تسجيل الدخول باستخدام اسم المستخدم وكلمة المرور الموضّحَين أسفل هذا الزر. |
|
سيتم تنفيذ جميع الأوامر الواردة في هذا الدرس التطبيقي حول الترميز ضمن Cloud Shell للمشروع الذي تم إنشاؤه وفتحه لك. افتح Cloud Shell من خلال النقر على رمز "تفعيل Cloud Shell" (Activate Cloud Shell) الموجود على الجانب الأيسر من عنوان صفحة وحدة التحكّم. سيسمح لك النصف السفلي من الصفحة بإدخال الأوامر وتشغيلها.ويمكن تشغيل الأوامر من جهاز الكمبيوتر الخاص بك، ولكن عليك أولاً تثبيت برامج التطوير المطلوبة وإعدادها. يتضمّن Cloud Shell جميع أدوات البرامج التي تحتاج إليها. |
|
تنزيل الرمز
انقر على مساحة سطر الأوامر في Cloud Shell لتتمكّن من كتابة الأوامر. استرجِع الرمز من Github، ثم انتقِل إلى مجلد الرمز:
git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd user-authentication-with-iap
يحتوي هذا المجلد على مجلد فرعي واحد لكل خطوة من خطوات هذا الدرس العملي. سيتم الانتقال إلى المجلد الصحيح لتنفيذ كل خطوة.
3- الخطوة 1: نشر التطبيق وحمايته باستخدام IAP
هذا تطبيق App Engine Standard مكتوب بلغة 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 نفسه من أي جهاز كمبيوتر متصل بالإنترنت للاطّلاع على صفحة الويب هذه. لم يتم حظر الوصول بعد.
حظر الوصول باستخدام ميزة "الشراء داخل التطبيق"
في نافذة وحدة تحكّم السحابة الإلكترونية، انقر على رمز القائمة في أعلى يمين الصفحة، ثم انقر على "الأمان" (Security) ثم على Identity-Aware Proxy. |
|
بما أنّ هذه هي المرة الأولى التي تفعّل فيها خيار مصادقة لهذا المشروع، ستظهر لك رسالة تفيد بأنّه عليك ضبط شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth قبل أن تتمكّن من استخدام ميزة "الشراء داخل التطبيق". |
|
انقر على الزر "ضبط شاشة الموافقة". سيتم فتح علامة تبويب جديدة لإعداد شاشة طلب الموافقة. |
|
املأ الفراغات المطلوبة بالقيم المناسبة:
اسم التطبيق | مثال على الشراء داخل التطبيق |
البريد الإلكتروني للحصول على الدعم | عنوان بريدك الإلكتروني، وقد يكون مكتوبًا لك مسبقًا |
النطاق المسموح به | جزء اسم المضيف من عنوان URL للتطبيق، مثل iap-example-999999.appspot.com. يمكنك الاطّلاع على ذلك في شريط العناوين لصفحة الويب Hello World التي فتحتها سابقًا. لا تُدرِج علامة البدء |
رابط الصفحة الرئيسية للتطبيق | عنوان URL الذي استخدمته لعرض تطبيقك |
رابط سياسة الخصوصية للتطبيق | رابط صفحة الخصوصية في التطبيق، وهو نفسه رابط الصفحة الرئيسية مع إضافة /privacy في النهاية |
انقر على حفظ. سيُطلب منك إنشاء بيانات اعتماد. لست بحاجة إلى إنشاء بيانات اعتماد لهذا الدرس التطبيقي حول الترميز، لذا يمكنك ببساطة إغلاق علامة تبويب المتصفّح هذه.
ارجع إلى صفحة Identity-Aware Proxy وأعِد تحميلها. من المفترض أن تظهر لك الآن قائمة بالموارد التي يمكنك حمايتها.انقر على زر التبديل في عمود IAP في صف تطبيق App Engine لتفعيل IAP. |
|
ستظهر لك أسماء النطاقات التي ستتم حمايتها من خلال IAP. انقر على "تفعيل". |
|
افتح الآن علامة تبويب متصفّح وانتقِل إلى عنوان URL الخاص بتطبيقك. ستظهر لك شاشة "تسجيل الدخول باستخدام حساب Google" تطلب منك تسجيل الدخول للوصول إلى التطبيق. |
|
سجِّل الدخول باستخدام حساب Google أو GSuite. ستظهر لك شاشة تمنعك من الوصول إلى المحتوى. |
|
لقد حميت تطبيقك بنجاح باستخدام ميزة "الشراء داخل التطبيق"، ولكن لم تحدّد بعد الحسابات التي يجب السماح لها بالوصول إلى التطبيق.
ارجع إلى صفحة Identity-Aware Proxy في وحدة التحكّم، وضَع علامة في مربّع الاختيار بجانب تطبيق App Engine، واطّلِع على الشريط الجانبي على يسار الصفحة. |
|
يجب إضافة كل عنوان بريد إلكتروني (أو عنوان مجموعة Google أو اسم نطاق G Suite) يجب السماح له بالوصول إلى قائمة الأعضاء. انقر على "إضافة عضو". أدخِل عنوان بريدك الإلكتروني، ثم اختَر دور "مستخدم تطبيق الويب الآمن من خلال Cloud IAP/IAP" لتخصيصه لهذا العنوان. يمكنك إدخال المزيد من العناوين أو نطاقات G Suite بالطريقة نفسها. |
|
انقر على "حفظ". ستظهر الرسالة "تم تعديل السياسة" في أسفل النافذة.
ارجِع إلى تطبيقك وأعِد تحميل الصفحة. من المفترض أن يظهر تطبيق الويب الآن، لأنّك سجّلت الدخول باستخدام مستخدم منحته الإذن. ومع ذلك، قد تظل ترى صفحة "ليس لديك إذن الوصول" لأنّ عملية التحقّق من التفويض قد لا تتم مرة أخرى في عمليات الشراء داخل التطبيق. في هذه الحالة، اتّبِع الخطوات التالية:
- افتح متصفّح الويب على عنوان الصفحة الرئيسية مع إضافة
/_gcp_iap/clear_login_cookieإلى نهاية عنوان URL، كما فيhttps://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie. - ستظهر لك شاشة جديدة بعنوان "تسجيل الدخول باستخدام حساب Google"، وسيظهر حسابك فيها. لا تنقر على الحساب. بدلاً من ذلك، انقر على "استخدام حساب آخر"، وأدخِل بيانات الاعتماد مرة أخرى.
- تؤدي هذه الخطوات إلى إعادة التحقّق من إذن الوصول إلى IAP، ومن المفترض أن تظهر لك الآن الشاشة الرئيسية لتطبيقك.
إذا كان بإمكانك الوصول إلى متصفّح آخر أو استخدام "وضع التصفّح المتخفي" في متصفّحك، وكان لديك حساب آخر صالح على Gmail أو G Suite، يمكنك استخدام هذا المتصفّح للانتقال إلى صفحة تطبيقك وتسجيل الدخول باستخدام الحساب الآخر. وبما أنّه لم يتم منح هذا الحساب الإذن، ستظهر له شاشة "ليس لديك إذن الوصول" بدلاً من تطبيقك.
4. الخطوة 2: الوصول إلى معلومات هوية المستخدم
بعد حماية أحد التطبيقات باستخدام IAP، يمكنه استخدام معلومات الهوية التي يوفّرها IAP في عناوين طلبات الويب التي يمرّرها. في هذه الخطوة، سيحصل التطبيق على عنوان البريد الإلكتروني للمستخدم الذي سجّل الدخول ورقم تعريف مستخدم فريد وثابت يحدّده "خدمة هوية Google" لهذا المستخدم. وسيتم عرض هذه البيانات للمستخدم في صفحة الترحيب.
هذه هي الخطوة 2، وقد انتهت الخطوة الأخيرة بفتح Cloud Shell في المجلد iap-codelab/1-HelloWorld. انتقِل إلى المجلد الخاص بهذه الخطوة:
cd ~/iap-codelab/2-HelloUser
النشر على App Engine
بما أنّ عملية النشر تستغرق بضع دقائق، ابدأ بنشر التطبيق في بيئة App Engine العادية لإصدار 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')
تقدّم خدمة IAP عناوين X-Goog-Authenticated-User-، والأسماء غير حساسة لحالة الأحرف، لذا يمكن تقديمها بأحرف صغيرة أو كبيرة حسب الرغبة. يتضمّن الآن بيان render_template هذه القيم حتى يمكن عرضها:
page = render_template('index.html', email=user_email, id=user_id)
يمكن لنموذج index.html عرض هذه القيم عن طريق تضمين الأسماء بين قوسَين معقوفَين مزدوجَين:
Hello, {{ email }}! Your persistent ID is {{ id }}.
كما ترى، يتم وضع البادئة accounts.google.com: قبل البيانات المقدَّمة، ما يوضّح مصدر المعلومات. يمكن لتطبيقك إزالة كل ما يصل إلى النقطتين الرأسيتين بما في ذلك النقطتان للحصول على القيم الأولية إذا أردت ذلك.
إيقاف ميزة "الشراء داخل التطبيق"
ماذا يحدث لهذا التطبيق إذا تم إيقاف ميزة "الشراء داخل التطبيق" أو تجاوزها بطريقة ما (مثل التطبيقات الأخرى التي تعمل في مشروع السحابة الإلكترونية نفسه)؟ أوقِف ميزة "الشراء داخل التطبيق" للاطّلاع على المحتوى.
في نافذة وحدة تحكّم السحابة الإلكترونية، انقر على رمز القائمة في أعلى يمين الصفحة، ثم انقر على "الأمان" (Security) ثم على Identity-Aware Proxy. انقر على مفتاح تبديل IAP بجانب تطبيق App Engine لإيقاف IAP. |
|
سيتم تحذيرك من أنّ هذا الإجراء سيسمح لجميع المستخدمين بالوصول إلى التطبيق.
أعِد تحميل صفحة الويب الخاصة بالتطبيق. ستظهر لك الصفحة نفسها، ولكن بدون أي معلومات عن المستخدم:

بما أنّ التطبيق أصبح غير محمي، يمكن للمستخدم إرسال طلب على الويب يبدو أنّه قد تم تمريره من خلال ميزة "الشراء داخل التطبيق". على سبيل المثال، يمكنك تنفيذ أمر 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 حلاً.
5- الخطوة 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، لذا لا يتم تقديم أي بيانات عن عمليات الشراء داخل التطبيق إلى التطبيق. من المفترض أن تظهر لك صفحة مشابهة لما يلي:

كما في السابق، قد تحتاج إلى الانتظار بضع دقائق حتى يتم نشر أحدث نسخة من الصفحة.
بما أنّ ميزة "الشراء داخل التطبيق" غير مفعّلة، لا تتوفّر أي معلومات عن المستخدمين. أعِد تفعيل عمليات الشراء داخل التطبيق.
في نافذة وحدة تحكّم السحابة الإلكترونية، انقر على رمز القائمة في أعلى يمين الصفحة، ثم انقر على "الأمان" (Security) ثم على Identity-Aware Proxy. انقر على مفتاح التبديل "الشراء داخل التطبيق" بجانب تطبيق 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 الذي تتم حمايته). تجمع دالتا المساعدة keys() وaudience() هذه القيم وتعرضانها.
يتضمّن العنصر الموقّع جزأين من البيانات التي نحتاج إليها: عنوان البريد الإلكتروني الذي تم إثبات ملكيته، وقيمة المعرّف الفريد (المقدَّمة في sub، بالنسبة إلى الحقل العادي للمشترك).
بهذا تنتهي الخطوة 3.
6. ملخّص
لقد نشرت تطبيق ويب على App Engine. في الخطوة 1، حصرت إمكانية الوصول إلى التطبيق على المستخدمين الذين اخترتهم فقط. في الخطوة 2، استرجعت هوية المستخدمين الذين سمحت لهم ميزة "الشراء داخل التطبيق" بالوصول إلى تطبيقك وعرضتها، ورأيت كيف يمكن تزوير هذه المعلومات في حال إيقاف ميزة "الشراء داخل التطبيق" أو تجاوزها. في الخطوة 3، تحقّقت من صحة تأكيدات الهوية الموقّعة تشفيرًا، والتي لا يمكن انتحالها.
7. تنظيف
إنّ موارد Google Cloud Platform الوحيدة التي استخدمتها في هذا الدرس التطبيقي حول الترميز هي مثيلات App Engine. في كل مرة نشرت فيها التطبيق، تم إنشاء إصدار جديد منه وسيظل متاحًا إلى أن يتم حذفه. اخرج من المختبر لحذف المشروع وجميع المراجع ضِمنه.











