۱. مقدمه
احراز هویت کاربران برنامه وب شما اغلب ضروری است و معمولاً نیاز به برنامهنویسی خاصی در برنامه شما دارد. برای برنامههای Google Cloud Platform میتوانید این مسئولیتها را به سرویس Identity-Aware Proxy واگذار کنید. اگر فقط نیاز به محدود کردن دسترسی به کاربران انتخاب شده دارید، هیچ تغییری در برنامه لازم نیست. در صورتی که برنامه نیاز به دانستن هویت کاربر داشته باشد (مانند حفظ تنظیمات برگزیده کاربر در سمت سرور)، Identity-Aware Proxy میتواند این کار را با حداقل کد برنامه انجام دهد.
پروکسی آگاه از هویت چیست؟
پروکسی آگاه از هویت (IAP) یک سرویس پلتفرم ابری گوگل است که درخواستهای وب ارسالی به برنامه شما را رهگیری میکند، کاربری را که با استفاده از سرویس هویت گوگل درخواست را ارسال میکند، احراز هویت میکند و فقط در صورتی به درخواستها اجازه عبور میدهد که از طرف کاربری باشند که شما مجاز میدانید. علاوه بر این، میتواند هدرهای درخواست را تغییر دهد تا شامل اطلاعات مربوط به کاربر احراز هویت شده باشد.
این آزمایشگاه کد، شما را در ایجاد برنامه خودتان، محدود کردن دسترسی به آن و دریافت هویت کاربر از IAP راهنمایی میکند.
آنچه خواهید ساخت
در این آزمایشگاه کد، شما یک برنامه وب مینیمال با Google App Engine خواهید ساخت، سپس روشهای مختلف استفاده از Identity-Aware Proxy را برای محدود کردن دسترسی به برنامه و ارائه اطلاعات هویت کاربر به آن بررسی خواهید کرد. برنامه شما:
|
|
آنچه یاد خواهید گرفت
- نحوه نوشتن و استقرار یک برنامه ساده App Engine با استفاده از پایتون 3.7
- نحوه فعال و غیرفعال کردن IAP برای محدود کردن دسترسی به برنامه شما
- چگونه اطلاعات هویت کاربر را از IAP به برنامه خود وارد کنیم؟
- نحوه تأیید رمزنگاری اطلاعات IAP برای محافظت در برابر جعل
آنچه نیاز دارید
- یک مرورگر وب مدرن مانند کروم .
- دانش پایه زبان برنامه نویسی پایتون
این آزمایشگاه کد بر روی موتور برنامه گوگل و IAP تمرکز دارد. مفاهیم و بلوکهای کد نامربوط حذف شدهاند و برای کپی و پیست ساده در اختیار شما قرار گرفتهاند.
۲. راهاندازی
شما در محیط خط فرمان Cloud Shell کار خواهید کرد. با باز کردن آن محیط و دریافت کد نمونه به آن شروع کنید.
کنسول و 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
این پوشه شامل یک زیرپوشه برای هر مرحله از این آزمایشگاه کد است. برای انجام هر مرحله به پوشه صحیح بروید.
۳. مرحله ۱ - استقرار برنامه و محافظت از آن با IAP
این یک برنامه App Engine Standard است که با پایتون ۳.۷ نوشته شده و به سادگی یک صفحه خوشامدگویی "Hello, World" را نمایش میدهد. ما آن را مستقر و آزمایش خواهیم کرد، سپس با استفاده از IAP دسترسی به آن را محدود خواهیم کرد.
بررسی کد برنامه
از پوشه اصلی پروژه به زیرپوشه 1-HelloWorld که حاوی کد مربوط به این مرحله است، تغییر دهید.
cd 1-HelloWorld
کد برنامه در فایل main.py قرار دارد. این فایل از چارچوب وب Flask برای پاسخ به درخواستهای وب با محتوای یک الگو استفاده میکند. آن فایل الگو در templates/index.html قرار دارد و در این مرحله فقط شامل HTML ساده است. فایل الگوی دوم شامل یک نمونهی اسکلتی از سیاست حفظ حریم خصوصی در templates/privacy.html است.
دو فایل دیگر نیز وجود دارد: requirements.txt که تمام کتابخانههای غیر پیشفرض پایتون مورد استفاده برنامه را فهرست میکند، و app.yaml به پلتفرم ابری گوگل میگوید که این یک برنامهی موتور برنامهی پایتون ۳.۷ است.
شما میتوانید هر فایل را در پوسته با استفاده از دستور cat فهرست کنید، مانند:
cat main.py
یا میتوانید ویرایشگر کد Cloud Shell را با کلیک روی آیکون مداد در سمت راست بالای پنجره Cloud Shell باز کنید و کد را از این طریق بررسی کنید.
برای این مرحله نیازی به تغییر هیچ فایلی ندارید.
استقرار در موتور برنامه
اکنون برنامه را در محیط استاندارد App Engine برای پایتون ۳.۷ مستقر کنید.
gcloud app deploy
ممکن است از شما خواسته شود منطقهای را برای استقرار انتخاب کنید. هر منطقهای که در نزدیکی شماست و میگوید «از استاندارد پشتیبانی میکند» را انتخاب کنید. وقتی از شما پرسیده شد که آیا میخواهید ادامه دهید، برای تأیید، Y را وارد کنید.
ظرف چند دقیقه، عملیات نصب باید تکمیل شود و پیامی مبنی بر امکان مشاهده برنامه با استفاده از gcloud app browse مشاهده خواهید کرد. این دستور را وارد کنید. اگر تب جدیدی در مرورگر شما باز نشد، روی لینک نمایش داده شده کلیک کنید تا در یک تب جدید باز شود، یا در صورت لزوم، آن را در یک تب جدید که به صورت دستی باز شده است، کپی کنید. از آنجایی که این اولین باری است که این برنامه اجرا میشود، چند ثانیه طول میکشد تا در حین شروع یک نمونه ابری، ظاهر شود و باید پنجره زیر را مشاهده کنید.

شما میتوانید همان URL را از هر کامپیوتری که به اینترنت متصل است باز کنید تا آن صفحه وب را ببینید. دسترسی هنوز محدود نشده است.
محدود کردن دسترسی با IAP
در پنجره کنسول ابری، روی نماد منو در سمت چپ بالای صفحه کلیک کنید، روی امنیت و سپس روی پروکسی آگاه از هویت کلیک کنید. |
|
از آنجایی که این اولین باری است که گزینه احراز هویت را برای این پروژه فعال میکنید، پیامی مشاهده خواهید کرد که میگوید قبل از استفاده از IAP، باید صفحه رضایت OAuth خود را پیکربندی کنید. |
|
روی دکمهی پیکربندی صفحهی رضایت کلیک کنید. یک برگهی جدید برای پیکربندی صفحهی رضایت باز خواهد شد. |
|
جاهای خالی مورد نیاز را با مقادیر مناسب پر کنید:
نام برنامه | مثال IAP |
ایمیل پشتیبانی | آدرس ایمیل شما. ممکن است از قبل برای شما پر شده باشد. |
دامنه مجاز | بخش نام میزبان از آدرس اینترنتی (URL) برنامه، مثلاً iap-example-999999.appspot.com. میتوانید این را در نوار آدرس صفحه وب Hello World که قبلاً باز کردهاید، مشاهده کنید. |
لینک صفحه اصلی برنامه | آدرس اینترنتی (URL) که برای مشاهده برنامه خود استفاده کردهاید |
لینک سیاست حفظ حریم خصوصی برنامه | لینک صفحه حریم خصوصی در برنامه، همانند لینک صفحه اصلی با /privacy اضافه شده به انتهای آن |
روی ذخیره کلیک کنید . از شما خواسته میشود که اعتبارنامه ایجاد کنید. نیازی به ایجاد اعتبارنامه برای این codelab نیست، بنابراین میتوانید به سادگی این برگه مرورگر را ببندید.
به صفحهی Identity-Aware Proxy برگردید و آن را رفرش کنید. اکنون باید فهرستی از منابعی را که میتوانید محافظت کنید، مشاهده کنید. برای فعال کردن IAP، روی دکمهی تغییر وضعیت در ستون IAP در ردیف App Engine app کلیک کنید. |
|
نام دامنههایی که توسط IAP محافظت میشوند را مشاهده خواهید کرد. روی روشن کردن (TURN ON) کلیک کنید. |
|
حالا یک تب مرورگر را باز کنید و به آدرس اینترنتی (URL) برنامه خود بروید. صفحه ورود با گوگل (Sign in with Google) به شما نمایش داده میشود که برای دسترسی به برنامه از شما میخواهد وارد سیستم شوید. |
|
با یک حساب گوگل یا GSuite وارد شوید. صفحهای را مشاهده خواهید کرد که دسترسی شما را رد میکند. |
|
شما با موفقیت برنامه خود را با IAP محافظت کردهاید، اما هنوز به IAP نگفتهاید که به کدام حسابها اجازه ورود بدهد.
به صفحه Identity-Aware Proxy در کنسول برگردید، کادر کنار App Engine app را علامت بزنید و نوار کناری سمت راست صفحه را ببینید. |
|
هر آدرس ایمیل (یا آدرس گروه گوگل یا نام دامنه GSuite) که باید اجازه دسترسی داشته باشد، باید به عنوان عضو اضافه شود. روی افزودن عضو کلیک کنید. آدرس ایمیل خود را وارد کنید، سپس نقش کاربر برنامه وب Cloud IAP/IAP-Secured را برای اختصاص به آن آدرس انتخاب کنید. میتوانید آدرسها یا دامنههای GSuite بیشتری را به همین روش وارد کنید. |
|
روی ذخیره کلیک کنید. پیام «سیاست بهروزرسانی شد» در پایین پنجره ظاهر میشود.
به برنامه خود برگردید و صفحه را دوباره بارگذاری کنید. اکنون باید برنامه وب خود را ببینید، زیرا قبلاً با کاربری که به آن مجوز دادهاید وارد سیستم شدهاید. با این حال، ممکن است همچنان صفحه "شما دسترسی ندارید" را مشاهده کنید زیرا IAP ممکن است مجوز شما را دوباره بررسی نکند. در این صورت، مراحل زیر را انجام دهید:
- مرورگر وب خود را باز کنید و به آدرس صفحه اصلی که عبارت
/_gcp_iap/clear_login_cookieبه انتهای آن اضافه شده است، مانندhttps://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie، بروید. - صفحه جدیدی با عنوان «ورود با گوگل» مشاهده خواهید کرد که حساب کاربری شما از قبل در آن نمایش داده میشود. روی حساب کاربری کلیک نکنید. در عوض، روی «استفاده از یک حساب دیگر» کلیک کنید و اطلاعات کاربری خود را دوباره وارد کنید.
- این مراحل باعث میشود IAP دسترسی شما را دوباره بررسی کند و اکنون باید صفحه اصلی برنامه خود را ببینید.
اگر به مرورگر دیگری دسترسی دارید یا میتوانید از حالت ناشناس در مرورگر خود استفاده کنید و یک حساب GMail یا GSuite معتبر دیگر دارید، میتوانید از آن مرورگر برای رفتن به صفحه برنامه خود و ورود به سیستم با حساب دیگر استفاده کنید. از آنجایی که آن حساب مجاز نشده است، به جای برنامه شما، صفحه "شما دسترسی ندارید" را مشاهده خواهید کرد.
۴. مرحله ۲ - دسترسی به اطلاعات هویت کاربر
وقتی یک برنامه با IAP محافظت میشود، میتواند از اطلاعات هویتی که IAP در هدرهای درخواست وب ارائه میدهد و از آنها عبور میکند، استفاده کند. در این مرحله، برنامه آدرس ایمیل کاربر وارد شده و یک شناسه کاربری منحصر به فرد دائمی که توسط سرویس هویت گوگل به آن کاربر اختصاص داده شده است را دریافت میکند. این دادهها در صفحه خوشامدگویی به کاربر نمایش داده میشوند.
این مرحله ۲ است و آخرین مرحله با باز کردن Cloud Shell شما در پوشه iap-codelab/1-HelloWorld به پایان رسید. برای این مرحله به پوشه زیر بروید:
cd ~/iap-codelab/2-HelloUser
استقرار در موتور برنامه
از آنجایی که استقرار چند دقیقه طول میکشد، با استقرار برنامه در محیط App Engine Standard برای پایتون ۳.۷ شروع کنید:
gcloud app deploy
وقتی از شما پرسیده شد که آیا میخواهید ادامه دهید، برای بله، Y را وارد کنید. ظرف چند دقیقه، استقرار باید کامل شود. در حالی که منتظر هستید، میتوانید فایلهای برنامه را همانطور که در زیر توضیح داده شده است، بررسی کنید.
وقتی نصب آماده شد، پیامی مشاهده خواهید کرد که میگوید میتوانید برنامه خود را با gcloud app browse مشاهده کنید. این دستور را وارد کنید. اگر تب جدیدی در مرورگر شما باز نشد، لینک نمایش داده شده را کپی کرده و آن را به طور عادی در یک تب جدید باز کنید. باید صفحهای مشابه صفحه زیر را ببینید:

ممکن است لازم باشد چند دقیقه صبر کنید تا نسخه جدید برنامه شما جایگزین نسخه قبلی شود. در صورت نیاز، صفحه را رفرش کنید تا صفحهای مشابه بالا را ببینید.
بررسی فایلهای برنامه
این پوشه شامل همان مجموعه فایلهایی است که در مرحله ۱ مشاهده کردید، اما دو فایل از آنها تغییر یافتهاند: main.py و templates/index.html . برنامه طوری تغییر کرده است که اطلاعات کاربر را که IAP در هدرهای درخواست ارائه میدهد، بازیابی کند و الگو اکنون آن دادهها را نمایش میدهد.
دو خط در main.py وجود دارد که دادههای هویت ارائه شده توسط IAP را دریافت میکنند:
user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')
هدرهای X-Goog-Authenticated-User- توسط IAP ارائه میشوند و نامها به حروف کوچک و بزرگ حساس نیستند، بنابراین در صورت تمایل میتوانند کاملاً با حروف کوچک یا کاملاً با حروف بزرگ نوشته شوند. دستور 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 : شروع میشوند که نشان میدهد اطلاعات از کجا آمدهاند. برنامه شما میتواند در صورت تمایل، همه چیز را تا علامت دو نقطه (+) حذف کند تا مقادیر خام را دریافت کند.
غیرفعال کردن IAP
اگر IAP غیرفعال شود یا به نحوی (مثلاً توسط برنامههای دیگری که در همان پروژه ابری شما اجرا میشوند) دور زده شود، چه اتفاقی برای این برنامه میافتد؟ برای مشاهده، IAP را خاموش کنید.
در پنجره کنسول ابری، روی نماد منو در سمت چپ بالای صفحه کلیک کنید، روی امنیت و سپس روی پروکسی آگاه از هویت کلیک کنید. برای خاموش کردن IAP، روی کلید تغییر وضعیت 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>
هیچ راهی برای برنامه وجود ندارد که بفهمد IAP غیرفعال یا دور زده شده است. برای مواردی که این یک خطر بالقوه است، مرحله 3 راه حلی را نشان میدهد.
۵. مرحله ۳ - استفاده از تأیید رمزنگاری
اگر خطر غیرفعال شدن یا دور زدن IAP وجود داشته باشد، برنامه شما میتواند بررسی کند تا مطمئن شود اطلاعات هویتی دریافتی معتبر است. این کار از یک هدر درخواست وب سوم که توسط IAP اضافه شده است، به نام X-Goog-IAP-JWT-Assertion استفاده میکند. مقدار این هدر، یک شیء با امضای رمزنگاری است که شامل دادههای هویت کاربر نیز میشود. برنامه شما میتواند امضای دیجیتال را تأیید کند و از دادههای ارائه شده در این شیء استفاده کند تا مطمئن شود که توسط IAP و بدون تغییر ارائه شده است.
تأیید امضای دیجیتال به چندین مرحله اضافی نیاز دارد، مانند بازیابی آخرین مجموعه کلیدهای عمومی گوگل. شما میتوانید بر اساس خطر خاموش کردن یا دور زدن IAP توسط کسی و حساسیت برنامه، تصمیم بگیرید که آیا برنامه شما به این مراحل اضافی نیاز دارد یا خیر.
این مرحله ۳ است و آخرین مرحله با باز کردن Cloud Shell شما در پوشه iap-codelab/2-HelloUser به پایان رسید. برای این مرحله به پوشه زیر بروید:
cd ~/iap-codelab/3-HelloVerifiedUser
استقرار در موتور برنامه
برنامه را در محیط استاندارد App Engine برای پایتون ۳.۷ مستقر کنید:
gcloud app deploy
وقتی از شما پرسیده شد که آیا میخواهید ادامه دهید، برای بله، Y را وارد کنید. ظرف چند دقیقه، استقرار باید کامل شود. در حالی که منتظر هستید، میتوانید فایلهای برنامه را همانطور که در زیر توضیح داده شده است، بررسی کنید.
وقتی نصب آماده شد، پیامی خواهید دید که میگوید میتوانید برنامه خود را با gcloud app browse مشاهده کنید. آن دستور را وارد کنید. اگر تب جدیدی در مرورگر شما باز نشد، لینک نمایش داده شده را کپی کرده و آن را به طور عادی در یک تب جدید باز کنید.
به یاد داشته باشید که در مرحله ۲، IAP را غیرفعال کردید، بنابراین هیچ داده IAP به برنامه ارائه نمیشود. باید صفحهای مشابه صفحه زیر را مشاهده کنید:

مانند قبل، ممکن است لازم باشد چند دقیقه صبر کنید تا جدیدترین نسخه منتشر شود و بتوانید نسخه جدید صفحه را ببینید.
از آنجایی که IAP غیرفعال است، هیچ اطلاعاتی از کاربر در دسترس نیست. اکنون IAP را دوباره فعال کنید.
در پنجره کنسول ابری، روی نماد منو در سمت چپ بالای صفحه کلیک کنید، روی امنیت و سپس روی پروکسی آگاه از هویت کلیک کنید. برای فعال کردن مجدد IAP، روی کلید تغییر وضعیت IAP در کنار برنامه App Engine کلیک کنید. |
|
صفحه را رفرش کنید. صفحه باید به شکل زیر باشد:

توجه داشته باشید که آدرس ایمیل ارائه شده توسط روش تأیید شده، پیشوند accounts.google.com: را ندارد.
اگر IAP خاموش یا دور زده شود، دادههای تأیید شده یا از دست میروند یا نامعتبر میشوند، زیرا نمیتوانند امضای معتبری داشته باشند، مگر اینکه توسط دارنده کلیدهای خصوصی گوگل ایجاد شده باشند.
بررسی فایلهای برنامه
این پوشه شامل همان مجموعه فایلهایی است که در مرحله ۲ مشاهده کردید، با این تفاوت که دو فایل تغییر یافته و یک فایل جدید ایجاد شده است. فایل جدید auth.py است که یک متد user() برای بازیابی و تأیید اطلاعات هویت امضا شده رمزنگاری شده ارائه میدهد. فایلهای تغییر یافته main.py و templates/index.html هستند که اکنون از نتایج آن متد استفاده میکنند. هدرهای تأیید نشده همانطور که در مرحله ۲ یافت شدند نیز برای مقایسه نشان داده شدهاند.
این قابلیت جدید عمدتاً در تابع 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 Cloud که محافظت میشود) ارائه میدهد، استفاده میکند. توابع کمکی keys() و audience() این مقادیر را جمعآوری و برمیگردانند.
شیء امضا شده دو قطعه داده مورد نیاز ما را دارد: آدرس ایمیل تأیید شده و مقدار شناسه منحصر به فرد (که در فیلد استاندارد sub برای subscriber ارائه شده است).
این مرحله 3 را تکمیل میکند.
۶. خلاصه
شما یک برنامه وب App Engine را مستقر کردید. در مرحله 1، دسترسی به برنامه را فقط به کاربرانی که خودتان انتخاب کردهاید محدود کردید. در مرحله 2، هویت کاربرانی را که IAP به آنها اجازه دسترسی به برنامه شما را داده است، بازیابی و نمایش دادید و دیدید که چگونه در صورت غیرفعال شدن یا دور زدن IAP، ممکن است این اطلاعات جعل شود. در مرحله 3، ادعاهای هویت کاربر که به صورت رمزنگاری امضا شدهاند را تأیید کردید، که قابل جعل نیستند.
۷. پاکسازی
تنها منابع پلتفرم ابری گوگل که در این آزمایشگاه کد استفاده کردهاید، نمونههای موتور برنامه (App Engine) هستند. هر بار که برنامه را مستقر میکنید، نسخه جدیدی ایجاد میشود و تا زمان حذف، همچنان وجود دارد. برای حذف پروژه و تمام منابع درون آن، از آزمایشگاه خارج شوید.











