احراز هویت کاربر با پروکسی Identity-Aware

احراز هویت کاربر با پروکسی Identity-Aware

درباره این codelab

subjectآخرین به‌روزرسانی: نوامبر ۲۰, ۲۰۲۱
account_circleنویسنده: engelke

1. مقدمه

احراز هویت کاربران برنامه وب شما اغلب ضروری است و معمولاً به برنامه نویسی خاصی در برنامه شما نیاز دارد. برای برنامه‌های Google Cloud Platform، می‌توانید این مسئولیت‌ها را به سرویس پروکسی Identity-Aware بسپارید. اگر فقط نیاز به محدود کردن دسترسی به کاربران انتخاب شده دارید، هیچ تغییری در برنامه لازم نیست. اگر برنامه نیاز به دانستن هویت کاربر داشته باشد (مانند حفظ تنظیمات برگزیده کاربر در سمت سرور)، پروکسی Identity-Aware می تواند آن را با حداقل کد برنامه ارائه دهد.

Identity-Aware Proxy (IAP) یک سرویس Google Cloud Platform است که درخواست‌های وب ارسال شده به برنامه شما را رهگیری می‌کند، کاربر درخواستی را با استفاده از سرویس هویت Google احراز هویت می‌کند، و تنها در صورتی به درخواست‌ها اجازه می‌دهد که از طرف کاربری باشند که شما مجاز هستید. علاوه بر این، می‌تواند سرصفحه‌های درخواست را طوری تغییر دهد که اطلاعات مربوط به کاربر تأیید شده را شامل شود.

این لبه کد شما را در ایجاد برنامه کاربردی خود، محدود کردن دسترسی به آن و دریافت هویت کاربر از IAP راهنمایی می کند.

آنچه خواهید ساخت

در این کد لبه، شما می‌خواهید یک برنامه وب مینیمال با Google App Engine بسازید، سپس راه‌های مختلفی برای استفاده از Identity-Aware Proxy برای محدود کردن دسترسی به برنامه و ارائه اطلاعات هویت کاربر به آن بررسی کنید. برنامه شما:

  • صفحه خوش آمدگویی را نمایش دهید
  • دسترسی به اطلاعات هویت کاربر ارائه شده توسط IAP
  • از تأیید رمزنگاری برای جلوگیری از جعل اطلاعات هویت کاربر استفاده کنید

چیزی که یاد خواهید گرفت

  • نحوه نوشتن و استقرار یک برنامه ساده App Engine با استفاده از Python 3.7
  • نحوه فعال و غیرفعال کردن IAP برای محدود کردن دسترسی به برنامه
  • چگونه اطلاعات هویت کاربر را از IAP به برنامه خود دریافت کنید
  • نحوه تأیید رمزنگاری اطلاعات از IAP برای محافظت در برابر جعل

آنچه شما نیاز دارید

  • یک مرورگر وب مدرن مانند کروم .
  • دانش اولیه زبان برنامه نویسی پایتون

این کد لبه روی Google App Engine و IAP متمرکز شده است. مفاهیم غیر مرتبط و بلوک‌های کد محو شده‌اند و برای شما ارائه می‌شوند تا به سادگی کپی و جای‌گذاری کنید.

2. در حال راه اندازی

شما در محیط خط فرمان Cloud Shell کار خواهید کرد. با باز کردن آن محیط و واکشی کد نمونه در آن شروع کنید.

کنسول و Cloud Shell را راه اندازی کنید

در قسمت سمت چپ بالای صفحه آزمایشگاه، روی دکمه Open Google Console کلیک کنید. شما باید با نام کاربری و رمز عبور نشان داده شده در زیر آن دکمه وارد شوید.

تمام دستورات موجود در این کد لبه برای پروژه ای که برای شما ایجاد و باز شده است در یک 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 است که در پایتون 3.7 نوشته شده است و به سادگی صفحه خوش آمدگویی "Hello, World" را نمایش می دهد. ما آن را مستقر و آزمایش می کنیم، سپس دسترسی به آن را با استفاده از IAP محدود می کنیم.

کد برنامه را مرور کنید

از پوشه اصلی پروژه به زیر پوشه 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 را با کلیک بر روی نماد Pencil در سمت راست بالای پنجره Cloud Shell باز کنید و کد را از این طریق بررسی کنید.

برای این مرحله نیازی به تغییر هیچ فایلی ندارید.

استقرار در App Engine

اکنون برنامه را در محیط App Engine Standard برای Python 3.7 مستقر کنید

gcloud app deploy

ممکن است از شما خواسته شود منطقه ای را برای استقرار انتخاب کنید. هر یک از نزدیکان خود را که می گوید "از استاندارد پشتیبانی می کند" انتخاب کنید. وقتی از شما پرسیده می شود که می خواهید ادامه دهید، Y برای بله وارد کنید.

چند دقیقه دیگر استقرار باید کامل شود و پیامی خواهید دید که می توانید برنامه خود را با gcloud app browse مشاهده کنید. آن دستور را وارد کنید. اگر یک برگه جدید در مرورگر شما باز نشد، روی پیوند نمایش داده شده کلیک کنید تا در یک برگه جدید باز شود یا در صورت لزوم آن را در یک برگه جدید باز شده به صورت دستی کپی کنید. از آنجایی که این اولین بار است که این برنامه اجرا می شود، چند ثانیه طول می کشد تا یک نمونه ابری شروع شود و باید پنجره زیر را مشاهده کنید.

1c1c0b166c6023e.png

می‌توانید همان URL را از هر رایانه متصل به اینترنت برای دیدن آن صفحه وب باز کنید. دسترسی هنوز محدود نشده است.

محدود کردن دسترسی با IAP

در پنجره کنسول ابری، روی نماد منو در سمت چپ بالای صفحه کلیک کنید، روی Security و سپس روی Identity-Aware Proxy کلیک کنید.

از آنجایی که این اولین باری است که گزینه احراز هویت را برای این پروژه فعال می کنید، پیامی خواهید دید که باید صفحه رضایت OAuth خود را قبل از استفاده از IAP پیکربندی کنید.

روی دکمه CONFIGURE Consent SCREEN کلیک کنید. یک برگه جدید برای پیکربندی صفحه رضایت باز می شود.

جاهای خالی مورد نیاز را با مقادیر مناسب پر کنید:

نام برنامه

مثال IAP

ایمیل پشتیبانی

آدرس ایمیل شما ممکن است قبلاً برای شما پر شده باشد.

دامنه مجاز

قسمت نام میزبان از URL برنامه، به عنوان مثال iap-example-999999.appspot.com. می توانید این را در نوار آدرس صفحه وب Hello World که قبلاً باز کرده اید مشاهده کنید. https:// یا دنباله / از آن URL وارد نکنید . پس از پر کردن این مقدار باید Enter را فشار دهید.

لینک صفحه اصلی برنامه

نشانی اینترنتی که برای مشاهده برنامه خود استفاده کردید

پیوند سیاست حفظ حریم خصوصی برنامه

پیوند صفحه حریم خصوصی در برنامه، مانند پیوند صفحه اصلی با /privacy به انتها اضافه شده است

روی ذخیره کلیک کنید . از شما خواسته می شود که اعتبارنامه ایجاد کنید. شما نیازی به ایجاد اعتبار برای این کد لبه ندارید، بنابراین می توانید به سادگی این برگه مرورگر را ببندید.

به صفحه Identity-Aware Proxy برگردید و آن را بازخوانی کنید. اکنون باید فهرستی از منابعی را که می‌توانید محافظت کنید ببینید. روی دکمه جابجایی در ستون IAP در ردیف برنامه App Engine کلیک کنید تا IAP روشن شود.

نام دامنه هایی را خواهید دید که توسط IAP محافظت می شوند. روی TURN ON کلیک کنید.

اکنون یک برگه مرورگر را باز کنید و به URL برنامه خود بروید. یک صفحه ورود با گوگل به شما نمایش داده می شود که از شما می خواهد برای دسترسی به برنامه وارد شوید.

با حساب Google یا GSuite وارد شوید. صفحه ای خواهید دید که دسترسی شما را ممنوع می کند.

شما با موفقیت از برنامه خود با IAP محافظت کرده اید، اما هنوز به IAP نگفته اید که کدام حساب ها را مجاز کند.

به صفحه Identity-Aware Proxy کنسول برگردید، کادر کنار برنامه App Engine را انتخاب کنید و نوار کناری را در سمت راست صفحه ببینید.

هر آدرس ایمیل (یا آدرس گروه Google یا نام دامنه GSuite) که باید اجازه دسترسی داشته باشد باید به عنوان عضو اضافه شود. روی ADD MEMBER کلیک کنید. آدرس ایمیل خود را وارد کنید، سپس نقش کاربری Cloud IAP/IAP-Secured Web App App را برای اختصاص دادن به آن آدرس انتخاب کنید. می توانید آدرس های بیشتری یا دامنه های GSuite را به همین روش وارد کنید.

روی ذخیره کلیک کنید. پیام "Policy Updated" در پایین پنجره ظاهر می شود.

به برنامه خود برگردید و صفحه را دوباره بارگیری کنید. اکنون باید برنامه وب خود را ببینید، زیرا قبلاً با کاربری مجاز وارد شده اید. با این حال، ممکن است همچنان صفحه "شما دسترسی ندارید" را ببینید زیرا IAP ممکن است مجوز شما را دوباره بررسی نکند. در این صورت مراحل زیر را انجام دهید:

  • مانند https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie ، مرورگر وب خود را به آدرس صفحه اصلی با /_gcp_iap/clear_login_cookie اضافه شده به انتهای URL باز کنید.
  • یک صفحه ورود به سیستم با Google جدید را خواهید دید که حساب شما از قبل نشان داده شده است. روی اکانت کلیک نکنید. در عوض، روی استفاده از یک حساب دیگر کلیک کنید و دوباره اطلاعات کاربری خود را وارد کنید.
  • این مراحل باعث می شود که IAP دوباره دسترسی شما را بررسی کند و اکنون باید صفحه اصلی برنامه خود را ببینید.

اگر به مرورگر دیگری دسترسی دارید یا می‌توانید از حالت ناشناس در مرورگر خود استفاده کنید، و حساب GMail یا GSuite معتبر دیگری دارید، می‌توانید از آن مرورگر برای پیمایش به صفحه برنامه خود و ورود به حساب دیگر استفاده کنید. از آنجایی که آن حساب مجاز نشده است، به جای برنامه شما، صفحه "شما دسترسی ندارید" را می بیند.

4. مرحله 2 - به اطلاعات هویت کاربر دسترسی پیدا کنید

هنگامی که یک برنامه با IAP محافظت می شود، می تواند از اطلاعات هویتی که IAP در سرصفحه های درخواست وب ارائه می کند استفاده کند. در این مرحله، اپلیکیشن آدرس ایمیل کاربر وارد شده و یک شناسه کاربری منحصر به فرد دائمی را که توسط سرویس هویت گوگل به آن کاربر اختصاص داده شده است، دریافت می کند. این داده ها در صفحه خوش آمدگویی به کاربر نمایش داده می شود.

این مرحله 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 مشاهده کنید. آن دستور را وارد کنید. اگر برگه جدیدی در مرورگر شما باز نشد، پیوند نمایش داده شده را کپی کرده و به طور معمول در یک تب جدید باز کنید. شما باید صفحه ای شبیه به زیر ببینید:

5b5fb03111258cec.png

ممکن است لازم باشد چند دقیقه صبر کنید تا نسخه جدید برنامه شما جایگزین نسخه قبلی شود. در صورت نیاز صفحه را رفرش کنید تا صفحه ای مشابه صفحه بالا ببینید.

فایل های برنامه را بررسی کنید

این پوشه حاوی همان مجموعه فایل‌هایی است که در مرحله 1 مشاهده شد، اما دو مورد از فایل‌ها تغییر کرده‌اند: 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 را خاموش کنید تا ببینید.

در پنجره کنسول ابری، روی نماد منو در سمت چپ بالای صفحه کلیک کنید، روی Security و سپس روی Identity-Aware Proxy کلیک کنید. برای خاموش کردن IAP، روی سوئیچ تعویض IAP در کنار برنامه App Engine کلیک کنید.

به شما اخطار داده می شود که این به همه کاربران امکان دسترسی به برنامه را می دهد.

صفحه وب اپلیکیشن را بازخوانی کنید. شما باید همان صفحه را ببینید، اما بدون هیچ گونه اطلاعات کاربری:

17c850de95fea839.png

از آنجایی که برنامه اکنون محافظت نشده است، کاربر می تواند درخواست وب را ارسال کند که به نظر می رسد از طریق IAP عبور کرده است. برای مثال، برای انجام این کار می‌توانید دستور curl زیر را از Cloud Shell اجرا کنید (به جای <your-url-here> آدرس صحیح برنامه خود را جایگزین کنید):

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 یک راه حل را نشان می دهد.

5. مرحله 3 - از تأیید رمزنگاری استفاده کنید

اگر خطر خاموش یا دور زدن IAP وجود دارد، برنامه شما می‌تواند بررسی کند که اطلاعات هویتی که دریافت می‌کند معتبر است. این از سومین هدر درخواست وب اضافه شده توسط IAP به نام X-Goog-IAP-JWT-Assertion استفاده می کند. مقدار هدر یک شی امضا شده رمزنگاری شده است که حاوی داده های هویت کاربر نیز می باشد. برنامه شما می تواند امضای دیجیتال را تأیید کند و از داده های ارائه شده در این شی استفاده کند تا مطمئن شود که بدون تغییر توسط IAP ارائه شده است.

تأیید امضای دیجیتال به چندین مرحله اضافی نیاز دارد، مانند بازیابی آخرین مجموعه کلیدهای عمومی Google. شما می توانید بر اساس خطری که ممکن است شخصی بتواند IAP را خاموش یا دور بزند و حساسیت برنامه تصمیم بگیرید که آیا برنامه شما به این مراحل اضافی نیاز دارد یا خیر.

این مرحله 3 است و آخرین مرحله با باز شدن Cloud Shell در پوشه iap-codelab/2-HelloUser به پایان رسید. برای این مرحله به پوشه تغییر دهید:

cd ~/iap-codelab/3-HelloVerifiedUser

استقرار در App Engine

برنامه را در محیط استاندارد App Engine برای Python 3.7 مستقر کنید:

gcloud app deploy

وقتی از شما پرسیده می شود که می خواهید ادامه دهید، Y را برای بله وارد کنید. ظرف چند دقیقه استقرار باید کامل شود. در حالی که منتظر هستید می توانید فایل های برنامه را همانطور که در زیر توضیح داده شده است بررسی کنید.

هنگامی که استقرار آماده شد، پیامی خواهید دید که می توانید برنامه خود را با gcloud app browse مشاهده کنید. آن دستور را وارد کنید. اگر برگه جدیدی در مرورگر شما باز نشد، پیوند نمایش داده شده را کپی کرده و به طور معمول در یک تب جدید باز کنید.

به یاد داشته باشید که IAP را در مرحله 2 غیرفعال کرده اید، بنابراین هیچ داده IAP به برنامه ارائه نمی شود. شما باید صفحه ای شبیه به زیر ببینید:

8ef2abcc23d96958.png

مانند قبل، ممکن است لازم باشد چند دقیقه منتظر بمانید تا جدیدترین نسخه زنده شود تا نسخه جدید صفحه را ببینید.

از آنجایی که IAP غیرفعال است، هیچ اطلاعات کاربری در دسترس نیست. حالا دوباره IAP را روشن کنید.

در پنجره کنسول ابری، روی نماد منو در سمت چپ بالای صفحه کلیک کنید، روی Security و سپس روی Identity-Aware Proxy کلیک کنید. برای روشن کردن مجدد IAP، روی سوئیچ تعویض IAP در کنار برنامه App Engine کلیک کنید.

صفحه را رفرش کنید. صفحه باید به شکل زیر باشد:

3a4d93c11f228852.png

توجه داشته باشید که آدرس ایمیل ارائه شده با روش تأیید شده دارای پیشوند accounts.google.com: نیست.

اگر IAP خاموش یا دور زده شود، داده‌های تأیید شده یا گم می‌شوند یا نامعتبر هستند، زیرا نمی‌توانند امضای معتبری داشته باشند مگر اینکه توسط دارنده کلیدهای خصوصی 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 را کامل می کند.

6. خلاصه

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

7. پاکسازی

تنها منابع Google Cloud Platform که در این کد لبه استفاده کردید، نمونه‌های App Engine هستند. هر بار که برنامه را اجرا می کردید، یک نسخه جدید ایجاد می شد و تا زمانی که حذف نشود وجود دارد. برای حذف پروژه و تمام منابع موجود در آن، از آزمایشگاه خارج شوید.