این سند توضیح میدهد که چگونه مجوز OAuth 2.0 را برای دسترسی به میاناهای برنامهسازی کاربردی Google از برنامه وب جاوا اسکریپت پیادهسازی کنید. OAuth 2.0 به کاربران اجازه میدهد دادههای خاصی را با برنامهای همرسانی کنند و درعینحال نامهای کاربری، گذرواژهها، و دیگر اطلاعاتشان را خصوصی نگه دارند. برای مثال، یک برنامه میتواند از OAuth 2.0 برای دریافت اجازه از کاربران برای ذخیره فایلها در Google Drive آنها استفاده کند.
این جریان OAuth 2.0 جریان اعطای ضمنی نامیده میشود. این نوع برای برنامههایی طراحی شده است که فقط وقتی کاربر در برنامه حضور دارد به میاناهای برنامهسازی کاربردی دسترسی پیدا میکنند. این برنامهها نمیتوانند اطلاعات محرمانه را ذخیره کنند.
در این جریان، برنامهتان نشانی وب Google را باز میکند که از پارامترهای پُرسمان برای شناسایی برنامهتان و نوع دسترسی به میانای برنامهسازی کاربردی که برنامه نیاز دارد استفاده میکند. میتوانید نشانی وب را در پنجره مرورگر فعلی یا کادر گفتگویی باز کنید. کاربر میتواند با Google اصالتسنجی کند و اجازههای درخواستشده را اعطا کند. سپس Google کاربر را به برنامه شما هدایت میکند. این هدایت شامل یک کد دسترسی است که برنامه شما آن را درستیسنجی میکند و سپس از آن برای ایجاد درخواستهای API استفاده میکند.
کتابخانه کارخواه Google APIs و سرویسهای مدیریت هویت Google
اگر از کتابخانه کارخواه Google APIs برای JavaScript برای برقراری تماسهای مجاز با Google استفاده میکنید، باید از کتابخانه JavaScript سرویسهای هویتی Google برای مدیریت جریان صدور مجوز استفاده کنید. قویاً توصیه میکنیم از مدل کد «سرویسهای مدیریت هویتسنجی Google» استفاده کنید که براساس جریان کد مجوز ایمنتر با PKCE است.
پیشنیازها
فعال کردن میاناهای برنامهسازی کاربردی برای پروژه
هر برنامهای که میاناهای برنامهسازی کاربردی Google را فراخوانی میکند باید آن میاناهای برنامهسازی کاربردی را در «کنسول میانای برنامهسازی کاربردی» فعال کند.
برای فعال کردن میانای برنامهسازی کاربردی برای پروژهتان:
- کتابخانه میانای برنامهسازی کاربردی را در «کنسول Google API» باز کنید.
- درصورت درخواست، پروژهای را انتخاب کنید یا پروژه جدیدی ایجاد کنید.
- «کتابخانه میانای برنامهسازی کاربردی» همه میاناهای برنامهسازی کاربردی دردسترس را براساس خانواده محصول و محبوبیت گروهبندی میکند. اگر API موردنظرتان برای فعال کردن در فهرست دیده نمیشود، از جستجو برای پیدا کردن آن استفاده کنید، یا روی مشاهده همه در خانواده محصولی که به آن تعلق دارد کلیک کنید.
- میانای برنامهسازی کاربردی موردنظرتان را برای فعال کردن انتخاب کنید، سپس روی دکمه فعال کردن کلیک کنید.
- اگر درخواست شد، صدور صورتحساب را فعال کنید.
- درصورت درخواست، «شرایط خدمات» API را بخوانید و بپذیرید.
ایجاد اطلاعات کاربری مجوز
هر برنامهای که از OAuth 2.0 برای دسترسی به Google APIs استفاده میکند باید اعتبارنامه مجوزدهی داشته باشد که برنامه را برای سرور OAuth 2.0 Google شناسایی کند. مراحل زیر نحوه ایجاد اطلاعات کاربری برای پروژه را توضیح میدهد. سپس برنامههایتان میتوانند از این اطلاعات اعتباری برای دسترسی به میاناهای برنامهسازی کاربردیای که برای آن پروژه فعال کردهاید استفاده کنند.
- به صفحه کارخواهان بروید.
- روی ایجاد مشتری کلیک کنید.
- نوع برنامه برنامه وب را انتخاب کنید.
- فرم را تکمیل کنید. برنامههایی که از جاوا اسکریپت برای درخواستهای مجاز Google API استفاده میکنند باید مبدأهای جاوا اسکریپت مجاز را مشخص کنند. مبدأها دامنههایی را شناسایی میکنند که برنامه شما میتواند از آنها درخواست به سرور OAuth 2.0 ارسال کند. این مبدأها باید از قوانین اعتبارسنجی Google پیروی کنند.
شناسایی کردن دامنههای دسترسی
گسترهها به برنامه شما امکان میدهند فقط به منابعی که نیاز دارد دسترسی داشته باشد و همچنین به کاربران امکان میدهند میزان دسترسیای را که به برنامه شما اعطا میکنند کنترل کنند. بنابراین، ممکن است بین تعداد گسترههای درخواستی و احتمال دریافت رضایت کاربر رابطه معکوس وجود داشته باشد.
قبلاز شروع پیادهسازی مجوز OAuth 2.0، توصیه میکنیم دامنههایی را که برنامهتان برای دسترسی به آنها به اجازه نیاز دارد شناسایی کنید.
سند OAuth 2.0 API Scopes حاوی فهرست کاملی از دامنههایی است که ممکن است برای دسترسی به Google API استفاده کنید.
دریافت کدهای دسترسی OAuth 2.0
مراحل زیر نشان میدهد که برنامه شما چگونه با سرور OAuth 2.0 Google تعامل میکند تا رضایت کاربر را برای انجام درخواست میانای برنامهسازی کاربردی ازطرف کاربر دریافت کند. برنامه شما باید این رضایت را داشته باشد تا بتواند درخواست Google API را که نیاز به مجوز کاربر دارد اجرا کند.
مرحله ۱: هدایت به سرور OAuth 2.0 در Google
برای درخواست اجازه دسترسی به دادههای کاربر، کاربر را به سرور OAuth 2.0 Google هدایت کنید.
نقطههای پایانی OAuth 2.0
نشانی وبی برای درخواست دسترسی از نقطه پایانی Google OAuth 2.0 در
https://accounts.google.com/o/oauth2/v2/auth ایجاد کنید. این نقطه پایانی ازطریق HTTPS قابلدسترسی است؛
اتصالهای HTTP ساده رد میشوند.
سرور مجوز Google از پارامترهای رشته پُرسمان زیر برای برنامههای سرور وب پشتیبانی میکند:
| پارامترها | |||||||
|---|---|---|---|---|---|---|---|
client_id |
الزامی
شناسه کارخواه برای برنامه شما. این مقدار را میتوانید در صفحه «کارخواهها» در «کنسول Cloud» پیدا کنید. |
||||||
redirect_uri |
الزامی
تعیین میکند که سرور API کاربر را پساز تکمیل جریان مجوزدهی به کجا هدایت کند. این مقدار باید دقیقاً با یکی از URIهای هدایت مجاز برای کارخواه OAuth 2.0 که در صفحه «کارخواهها» در Cloud Console کارخواه پیکربندی کردهاید مطابقت داشته باشد. اگر این مقدار با
URI تغییرمسیر مجاز برای توجه داشته باشید که طرح |
||||||
response_type |
الزامی
برنامههای جاوا اسکریپت باید مقدار پارامتر را روی |
||||||
scope |
الزامی
فهرستی از دامنهها که با فاصله از هم جدا شدهاند و منابعی را که برنامه شما میتواند ازطرف کاربر به آنها دسترسی داشته باشد شناسایی میکند. این مقادیر به صفحه رضایت که Google به کاربر نمایش میدهد اطلاعرسانی میکند. گسترهها به برنامه شما امکان میدهند فقط به منابعی که نیاز دارد درخواست دسترسی بدهد و درعینحال به کاربران امکان میدهند میزان دسترسیای را که به برنامه شما اعطا میکنند کنترل کنند. بنابراین، رابطهای معکوس بین تعداد دامنههای درخواستی و احتمال کسب رضایت کاربر وجود دارد. توصیه میکنیم برنامهتان هر زمان که ممکن بود دسترسی به گسترههای مجوز را در بافت درخواست کند. با درخواست دسترسی به دادههای کاربر در بافت، بااستفاده از احراز هویت فزاینده، به کاربران کمک میکنید متوجه شوند چرا برنامهتان به دسترسیای که درخواست میکند نیاز دارد. |
||||||
state |
توصیهشده
هر مقدار رشتهای را که برنامهتان برای حفظ وضعیت بین درخواست مجوز شما و پاسخ سرور مجوز استفاده میکند مشخص میکند.
سرور مقدار دقیقی را که بهعنوان جفت میتوانید از این پارامتر برای اهداف مختلفی استفاده کنید، ازجمله هدایت کاربر به
منبع صحیح در برنامهتان، ارسال عدد یکبارمصرف، و کاهش جعل درخواست
بینسایتی. ازآنجاییکه |
||||||
include_granted_scopes |
اختیاری
برنامهها را قادر میسازد تا از مجوز افزایشی برای درخواست دسترسی به دامنههای اضافی در بافت استفاده کنند. اگر مقدار این پارامتر را روی |
||||||
enable_granular_consent |
اختیاری
پیشفرضها به وقتی Google اجازههای ریزدانه را برای برنامهای فعال میکند، این پارامتر دیگر تأثیری نخواهد داشت. |
||||||
login_hint |
اختیاری
اگر برنامه شما میداند کدام کاربر درحال تلاش برای اصالتسنجی است، میتواند از این پارامتر برای ارائه راهنمایی به «سرور اصالتسنجی Google» استفاده کند. سرور از این راهنمایی برای ساده کردن جریان ورود به سیستم استفاده میکند، یا با پیشپر کردن فیلد ایمیل در فرم ورود به سیستم یا با انتخاب جلسه چندورودی مناسب. مقدار پارامتر را روی نشانی ایمیل یا شناسه |
||||||
prompt |
اختیاری
فهرست پیاموارههای حساس به حروف بزرگ و کوچک که با فاصله از هم جدا شدهاند تا به کاربر ارائه شوند. اگر این پارامتر را مشخص نکنید، فقط اولین باری که پروژه شما درخواست دسترسی میکند، از کاربر درخواست میشود. برای اطلاعات بیشتر، درخواست مجدد رضایت را ببینید. مقادیر ممکن عبارتاند از:
|
||||||
نمونه هدایت به سرور مجوز Google
نمونه نشانی وب در زیر نشان داده شده است، با شکست خط و فاصله برای خوانایی.
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly%20https%3A//www.googleapis.com/auth/calendar.readonly& include_granted_scopes=true& response_type=token& state=state_parameter_passthrough_value& redirect_uri=https%3A//developers.google.com/oauthplayground& client_id=client_id
پساز ایجاد نشانی وب درخواست، کاربر را به آن هدایت کنید.
کد نمونه جاوا اسکریپت
قطعه کد جاوا اسکریپت زیر نشان میدهد که چگونه جریان مجوز را در جاوا اسکریپت بدون استفاده از کتابخانه مشتری Google APIs برای جاوا اسکریپت آغاز کنید. ازآنجاییکه این نقطه پایانی OAuth 2.0 از «همرسانی منبع میانمبدئی» (CORS) پشتیبانی نمیکند، قطعه کدی فرمی ایجاد میکند که درخواست را برای آن نقطه پایانی باز میکند.
/* * Create form to request access token from Google's OAuth 2.0 server. */ function oauthSignIn() { // Google's OAuth 2.0 endpoint for requesting an access token var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth'; // Create <form> element to submit parameters to OAuth 2.0 endpoint. var form = document.createElement('form'); form.setAttribute('method', 'GET'); // Send as a GET request. form.setAttribute('action', oauth2Endpoint); // Parameters to pass to OAuth 2.0 endpoint. var params = {'client_id': 'YOUR_CLIENT_ID', 'redirect_uri': 'YOUR_REDIRECT_URI', 'response_type': 'token', 'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/calendar.readonly', 'include_granted_scopes': 'true', 'state': 'pass-through value'}; // Add form parameters as hidden input values. for (var p in params) { var input = document.createElement('input'); input.setAttribute('type', 'hidden'); input.setAttribute('name', p); input.setAttribute('value', params[p]); form.appendChild(input); } // Add form to page and submit it to open the OAuth 2.0 endpoint. document.body.appendChild(form); form.submit(); }
مرحله ۲: Google از کاربر درخواست رضایت میکند
در این مرحله، کاربر تصمیم میگیرد که دسترسی درخواستی را به برنامه شما اعطا کند یا نه. در این مرحله، Google پنجره رضایتی را نمایش میدهد که نام برنامه شما و سرویسهای Google API را که برنامه برای دسترسی به آنها با اطلاعات کاربری مجاز کاربر درخواست اجازه میکند و خلاصهای از دامنههای دسترسی که باید اعطا شود نشان میدهد. سپس کاربر میتواند با اعطای دسترسی به یک یا چند دامنه درخواستشده توسط برنامه شما موافقت کند یا درخواست را رد کند.
برنامه شما در این مرحله نیازی به انجام کاری ندارد زیرا منتظر پاسخ از سرور OAuth 2.0 Google است که نشان میدهد آیا دسترسی اعطا شده است یا خیر. آن پاسخ در مرحله زیر توضیح داده شده است.
خطاها
درخواستهای ارسالشده به نقطه پایانی مجوز OAuth 2.0 Google ممکن است بهجای جریانهای اصالتسنجی و مجوز موردانتظار، پیامهای خطای سَمت کاربر نمایش دهند. کدهای خطای رایج و راهحلهای پیشنهادی عبارتاند از:
admin_policy_enforced
«حساب Google» بهدلیل خطمشیهای سرپرست Google Workspace نمیتواند یک یا چند دامنه درخواستی را مجاز کند. برای کسب اطلاعات بیشتر درباره اینکه سرپرست چگونه میتواند دسترسی به همه دامنهها یا دامنههای حساس و محدودشده را تا زمانی که دسترسی صریحاً به شناسه کارخواه OAuth شما اعطا شود محدود کند، به مقاله راهنمای سرپرست Google Workspace با عنوان کنترل اینکه کدام برنامههای داخلی و طرف سوم به دادههای Google Workspace دسترسی داشته باشند مراجعه کنید.
disallowed_useragent
نقطه پایان مجوز در نماینده کاربر جاسازیشدهای نمایش داده میشود که خطمشیهای OAuth 2.0 Google آن را مجاز نمیداند.
توسعهدهندگان iOS و macOS ممکن است هنگام باز کردن درخواستهای مجوز در
WKWebView با این خطا مواجه شوند.
توسعهدهندگان باید بهجای آن از کتابخانههای iOS مانند
ورود به سیستم با Google برای iOS یا
AppAuth برای iOS
از بنیاد OpenID استفاده کنند.
توسعهدهندگان وب ممکن است با این خطا مواجه شوند وقتی یک برنامه iOS یا macOS یک پیوند وب عمومی را در یک نماینده کاربر جاسازیشده باز میکند و کاربر از سایت شما به نقطه پایانی مجوز OAuth 2.0 Google هدایت میشود. توسعهدهندگان باید اجازه دهند
پیوندهای عمومی در کنترلکننده پیوند پیشفرض سیستمعامل باز شود،
که شامل هر دو
کنترلکننده پیوندهای جامع
یا برنامه مرورگر پیشفرض میشود. کتابخانه SFSafariViewController
نیز گزینهای پشتیبانیشده است.
org_internal
شناسه کارخواه OAuth در درخواست بخشی از پروژهای است که دسترسی به «حسابهای Google» را در سازمان Google Cloud خاصی محدود میکند. برای اطلاعات بیشتر درباره این گزینه پیکربندی، به بخش نوع کاربر در مقاله راهنمای «راهاندازی صفحه موافقت OAuth» مراجعه کنید.
invalid_client
مبدأی که درخواست از آن ارسال شده است برای این کارخواه مجاز نیست. به
origin_mismatch مراجعه کنید.
deleted_client
کارخواه OAuth که برای درخواست استفاده میشود حذف شده است. حذف میتواند بهصورت دستی یا خودکار درصورت استفاده نشدن از مشتری انجام شود. مشتریان حذفشده را میتوان ظرف ۳۰ روز پساز حذف بازیابی کرد. بیشتر بدانید.
invalid_grant
هنگام استفاده از مجوز افزایشی، ممکن است توکن منقضی شده باشد یا نامعتبر شده باشد. دوباره کاربر را اصالتسنجی کنید و برای دریافت کردن توکنهای جدید از کاربر رضایت بخواهید. اگر همچنان این خطا را میبینید، مطمئن شوید که برنامهتان بهدرستی پیکربندی شده است و از کدها و پارامترهای صحیح در درخواستتان استفاده میکنید. درغیراینصورت، ممکن است حساب کاربر حذف یا غیرفعال شده باشد.
origin_mismatch
طرح، دامنه، و/یا درگاه جاوا اسکریپت که درخواست مجوز را آغاز میکند ممکن است با URI مبدأ جاوا اسکریپت مجاز ثبتشده برای شناسه کارخواه OAuth مطابقت نداشته باشد. مبدأهای جاوا اسکریپت مجاز را در صفحه «کارخواهها» در Google Cloud Console مرور کنید.
redirect_uri_mismatch
redirect_uri ارسالشده در درخواست مجوز با نشانی وب هدایت مجاز برای شناسه کارخواه OAuth مطابقت ندارد. URIهای هدایت مجاز را در
صفحه «کارخواهها» در Google Cloud Console
مرور کنید.
طرح، دامنه، و/یا درگاه جاوا اسکریپت که درخواست مجوز را آغاز میکند ممکن است با URI مبدأ جاوا اسکریپت مجاز ثبتشده برای شناسه کارخواه OAuth مطابقت نداشته باشد. مبدأهای جاوا اسکریپت مجاز را در صفحه «کارخواهها» در Google Cloud Console مرور کنید.
پارامتر redirect_uri ممکن است به جریان OAuth خارجاز باند (OOB) اشاره داشته باشد که منسوخ شده است و دیگر پشتیبانی نمیشود. برای بهروزرسانی ادغام، به
راهنمای
انتقال مراجعه کنید.
invalid_request
مشکلی در درخواست شما وجود داشت. این مشکل ممکن است به چند دلیل باشد:
- درخواست بهدرستی قالببندی نشده بود
- درخواست فاقد پارامترهای الزامی بود
- درخواست از روش صدور مجوزی استفاده میکند که Google از آن پشتیبانی نمیکند. تأیید کنید که یکپارچهسازی OAuth شما از روش یکپارچهسازی توصیهشده استفاده میکند
مرحله ۳: رسیدگی به پاسخ سرور OAuth 2.0
نقطههای پایانی OAuth 2.0
سرور OAuth 2.0 پاسخی به redirect_uri مشخصشده در درخواست کد دسترسی شما ارسال میکند.
اگر کاربر درخواست را تأیید کند، پاسخ حاوی کد دسترسی خواهد بود. اگر کاربر درخواست را تأیید نکند، پاسخ حاوی پیام خطا خواهد بود. کد دسترسی یا پیام خطا در قطعه درهمسازی شناسه URI هدایت برگردانده میشود، همانطور که در مثالهای زیر نشان داده شده است:
پاسخ کد دسترسی:
https://oauth2.example.com/callback#access_token=4/P7q7W91&token_type=Bearer&expires_in=3600
علاوهبر پارامتر
access_token، رشته قطعه همچنین حاوی پارامترtoken_typeاست که همیشه رویBearerتنظیم شده است، و پارامترexpires_inکه طول عمر توکن را برحسب ثانیه مشخص میکند. اگر پارامترstateدر درخواست کد دسترسی مشخص شده باشد، مقدار آن نیز در پاسخ گنجانده میشود.- پاسخ خطا:
https://oauth2.example.com/callback#error=access_denied
نمونه پاسخ سرور OAuth 2.0
میتوانید این جریان را با کلیک کردن روی نمونه نشانی وب زیر آزمایش کنید، که درخواست دسترسی فقط خواندنی برای مشاهده فراداده فایلها در Google Drive شما و دسترسی فقط خواندنی برای مشاهده رویدادهای «تقویم Google» شما را دارد:
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly%20https%3A//www.googleapis.com/auth/calendar.readonly& include_granted_scopes=true& response_type=token& state=state_parameter_passthrough_value& redirect_uri=https%3A//developers.google.com/oauthplayground& client_id=client_id
پساز تکمیل جریان OAuth 2.0، مرورگرتان شما را به OAuth 2.0 Playground هدایت میکند که ابزاری برای آزمایش جریانهای OAuth است. خواهید دید که OAuth 2.0 Playground بهطور خودکار کد مجوز را ضبط کرده است.
مرحله ۴: بررسی کنید کاربران کدام دامنهها را اعطا کردهاند
هنگام درخواست چندین اجازه (دامنه)، ممکن است کاربران به برنامه شما اجازه دسترسی به همه آنها را ندهند. برنامه شما باید تأیید کند که کدام دامنهها واقعاً اعطا شدهاند و موقعیتهایی را که برخیاز اجازهها رد شدهاند بهخوبی مدیریت کند، معمولاً با غیرفعال کردن ویژگیهایی که به آن دامنههای ردشده متکی هستند.
بااینحال، چند استثنا وجود دارد. برنامههای Google Workspace Enterprise با واگذاری اختیارات در سراسر دامنه، یا برنامههایی که بهعنوان مورد اعتماد علامتگذاری شدهاند، صفحه رضایت اجازههای ریزدانه را دور میزنند. برای این برنامهها، کاربران صفحه رضایت اجازه جزئی را نخواهند دید. درعوض، برنامهتان یا همه گسترههای درخواستشده را دریافت میکند یا هیچکدام را دریافت نمیکند.
برای اطلاعات دقیقتر، نحوه مدیریت اجازههای ریزدانه را ببینید.
نقطههای پایانی OAuth 2.0
برای بررسی اینکه آیا کاربر به برنامه شما اجازه دسترسی به دامنه خاصی را داده است یا نه،
فیلد scope را در پاسخ کد دسترسی بررسی کنید. حوزههای دسترسی اعطاشده توسط
access_token که بهصورت فهرستی از رشتههای حساس به حروف بزرگ و کوچک و جداشده با فاصله بیان شده است.
برای مثال، پاسخ کد دسترسی نمونه زیر نشان میدهد که کاربر به برنامه شما اجازه دسترسی به فعالیت Drive فقط خواندنی و اجازههای رویدادهای «تقویم» را داده است:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/calendar.readonly", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
فراخوانی میاناهای برنامهسازی کاربردی Google
نقطههای پایانی OAuth 2.0
پساز اینکه برنامهتان کد دسترسی را دریافت کرد، میتوانید از این کد برای برقراری تماس با Google API ازطرف حساب کاربری مشخصی استفاده کنید، بهشرطی که دامنه(های) دسترسی موردنیاز API اعطا شده باشد. برای انجام این کار،
کد دسترسی را با گنجاندن پارامتر پُرسمان access_token یا مقدار سرایند HTTP Authorization Bearer در درخواست به میانای برنامهسازی کاربردی بگنجانید. درصورت امکان،
سرایند HTTP ترجیح داده میشود، زیرا رشتههای پرسمان معمولاً در گزارشهای سرور قابلمشاهده هستند. در اکثر موارد، میتوانید از کتابخانه کارخواه برای راهاندازی تماسهایتان با Google API استفاده کنید (برای مثال، هنگام فراخوانی Drive Files API).
میتوانید همه میاناهای برنامهسازی کاربردی Google را امتحان کنید و دامنههای آنها را در OAuth 2.0 Playground مشاهده کنید.
نمونههای HTTP GET
فراخوانی نقطه پایانی
drive.files
(Drive Files API) بااستفاده از سرایند HTTP
Authorization: Bearer ممکن است شبیه به این باشد. توجه داشته باشید که باید کد دسترسی خودتان را مشخص کنید:
GET /drive/v2/files HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
در اینجا فراخوانی برای همان میانای برنامهسازی کاربردی برای کاربر اصالتسنجیشده بااستفاده از پارامتر رشته پُرسمان access_token ارائه شده است:
GET https://www.googleapis.com/drive/v2/files?access_token=access_token
curl مثال
میتوانید این فرمانها را با برنامه خط فرمان curl آزمایش کنید. در اینجا
نمونهای آورده شده است که از گزینه سرایند HTTP (ترجیحی) استفاده میکند:
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files
یا، بهعنوان گزینه جایگزین، گزینه پارامتر رشته پُرسمان:
curl https://www.googleapis.com/drive/v2/files?access_token=access_token
کد نمونه جاوا اسکریپت
تکهکد زیر نشان میدهد که چگونه از CORS (همرسانی منبع میانمبدئی) برای ارسال درخواست به Google API استفاده کنید. این مثال از کتابخانه کارخواه Google APIs برای جاوا اسکریپت استفاده نمیکند. بااینحال، حتی اگر از کتابخانه کارخواه استفاده نمیکنید، راهنمای پشتیبانی CORS در اسناد آن کتابخانه احتمالاً به شما کمک میکند این درخواستها را بهتر درک کنید.
در این تکهکد، متغیر access_token نشاندهنده توکنی است که برای درخواستهای API ازطرف کاربر مجاز دریافت کردهاید. نمونه کامل نشان میدهد که چگونه آن توکن را در فضای ذخیرهسازی محلی مرورگر ذخیره کنید و آن را هنگام درخواست API بازیابی کنید.
var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://www.googleapis.com/drive/v3/about?fields=user&' + 'access_token=' + params['access_token']); xhr.onreadystatechange = function (e) { console.log(xhr.response); }; xhr.send(null);
نمونه کامل
نقطههای پایانی OAuth 2.0
این نمونه کد نشان میدهد که چگونه جریان OAuth 2.0 را در جاوا اسکریپت بدون استفاده از کتابخانه کارخواه Google APIs برای جاوا اسکریپت تکمیل کنید. این کد برای صفحه HTML است که دکمهای را برای امتحان کردن درخواست API نمایش میدهد. اگر روی دکمه کلیک کنید، کد بررسی میکند که آیا صفحه کد دسترسی به میانای برنامهسازی کاربردی را در فضای ذخیرهسازی محلی مرورگرتان ذخیره کرده است یا نه. اگر اینطور باشد، درخواست میانای برنامهسازی کاربردی را اجرا میکند. درغیراینصورت، جریان OAuth 2.0 را آغاز میکند.
برای جریان OAuth 2.0، صفحه این مراحل را دنبال میکند:
- این برنامه کاربر را به سرور OAuth 2.0 در Google هدایت میکند که درخواست دسترسی به
https://www.googleapis.com/auth/drive.metadata.readonlyوhttps://www.googleapis.com/auth/calendar.readonlyرا دارد. - پساز اعطا (یا رد) دسترسی به یک یا چند دامنه درخواستی، کاربر به صفحه اصلی هدایت میشود که کد دسترسی را از رشته شناسه قطعه تجزیه میکند.
- این صفحه بررسی میکند که کاربر به کدام دامنهها اجازه دسترسی به برنامه را داده است.
اگر کاربر به دامنه(های) درخواستی دسترسی داده باشد، صفحه از کد دسترسی برای ایجاد درخواست نمونه میانای برنامهسازی کاربردی استفاده میکند.
درخواست میانای برنامهسازی کاربردی، روش
about.getمیانای برنامهسازی کاربردی Drive را برای بازیابی اطلاعات درباره حساب Google Drive کاربر مجاز فراخوانی میکند.- اگر درخواست باموفقیت اجرا شود، پاسخ میانای برنامهسازی کاربردی در کنسول اشکالزدایی مرورگر ثبت میشود.
میتوانید دسترسی به برنامه را ازطریق صفحه اجازهها برای «حساب Google» خود لغو کنید. برنامه بهعنوان نام برنامه ارائهشده در صفحه نمانامسازی در صفحه رضایت OAuth درطول ایجاد شناسه کارخواه فهرست شده است.
برای اجرای این کد بهصورت محلی، باید مقادیری را برای متغیرهای YOUR_CLIENT_ID و YOUR_REDIRECT_URI تنظیم کنید که با اعتبارنامههای مجوز شما مطابقت داشته باشند. متغیر YOUR_REDIRECT_URI
باید روی همان نشانی وبی تنظیم شود که صفحه در آن ارائه میشود. این مقدار باید دقیقاً با یکی از
URIهای هدایت مجاز برای کارخواه OAuth 2.0 که در صفحه «کارخواههای Cloud Console» پیکربندی کردهاید
مطابقت داشته باشد. اگر
این مقدار با URI مجاز مطابقت نداشته باشد، خطای redirect_uri_mismatch
دریافت خواهید کرد. پروژه شما باید
میانای برنامهسازی کاربردی مناسب را برای این درخواست فعال کرده باشد.
<html><head></head><body>
<script>
var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';
// Parse query string to see if page request is coming from OAuth 2.0 server.
var fragmentString = location.hash.substring(1);
var params = {};
var regex = /([^&=]+)=([^&]*)/g, m;
while (m = regex.exec(fragmentString)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
}
if (Object.keys(params).length > 0 && params['state']) {
if (params['state'] == localStorage.getItem('state')) {
localStorage.setItem('oauth2-test-params', JSON.stringify(params) );
trySampleRequest();
} else {
console.log('State mismatch. Possible CSRF attack');
}
}
// Function to generate a random state value
function generateCryptoRandomState() {
const randomValues = new Uint32Array(2);
window.crypto.getRandomValues(randomValues);
// Encode as UTF-8
const utf8Encoder = new TextEncoder();
const utf8Array = utf8Encoder.encode(
String.fromCharCode.apply(null, randomValues)
);
// Base64 encode the UTF-8 data
return btoa(String.fromCharCode.apply(null, utf8Array))
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
}
// If there's an access token, try an API request.
// Otherwise, start OAuth 2.0 flow.
function trySampleRequest() {
var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
if (params && params['access_token']) {
// User authorized the request. Now, check which scopes were granted.
if (params['scope'].includes('https://www.googleapis.com/auth/drive.metadata.readonly')) {
// User authorized read-only Drive activity permission.
// Calling the APIs, etc.
var xhr = new XMLHttpRequest();
xhr.open('GET',
'https://www.googleapis.com/drive/v3/about?fields=user&' +
'access_token=' + params['access_token']);
xhr.onreadystatechange = function (e) {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.response);
} else if (xhr.readyState === 4 && xhr.status === 401) {
// Token invalid, so prompt for user permission.
oauth2SignIn();
}
};
xhr.send(null);
}
else {
// User didn't authorize read-only Drive activity permission.
// Update UX and application accordingly
console.log('User did not authorize read-only Drive activity permission.');
}
// Check if user authorized Calendar read permission.
if (params['scope'].includes('https://www.googleapis.com/auth/calendar.readonly')) {
// User authorized Calendar read permission.
// Calling the APIs, etc.
console.log('User authorized Calendar read permission.');
}
else {
// User didn't authorize Calendar read permission.
// Update UX and application accordingly
console.log('User did not authorize Calendar read permission.');
}
} else {
oauth2SignIn();
}
}
/*
* Create form to request access token from Google's OAuth 2.0 server.
*/
function oauth2SignIn() {
// create random state value and store in local storage
var state = generateCryptoRandomState();
localStorage.setItem('state', state);
// Google's OAuth 2.0 endpoint for requesting an access token
var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';
// Create element to open OAuth 2.0 endpoint in new window.
var form = document.createElement('form');
form.setAttribute('method', 'GET'); // Send as a GET request.
form.setAttribute('action', oauth2Endpoint);
// Parameters to pass to OAuth 2.0 endpoint.
var params = {'client_id': YOUR_CLIENT_ID,
'redirect_uri': YOUR_REDIRECT_URI,
'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/calendar.readonly',
'state': state,
'include_granted_scopes': 'true',
'response_type': 'token'};
// Add form parameters as hidden input values.
for (var p in params) {
var input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('name', p);
input.setAttribute('value', params[p]);
form.appendChild(input);
}
// Add form to page and submit it to open the OAuth 2.0 endpoint.
document.body.appendChild(form);
form.submit();
}
</script>
<button onclick="trySampleRequest();">Try sample request</button>
</body></html>قوانین اعتبارسنجی مبدأ جاوا اسکریپت
Google قوانین اعتبارسنجی زیر را برای مبدأهای JavaScript اعمال میکند تا به توسعهدهندگان کمک کند امنیت برنامههایشان را حفظ کنند. مبدأهای جاوا اسکریپت شما باید از این قوانین پیروی کنند. برای تعریف دامنه، میزبان، و طرح که در این قوانین استفاده شده است، به بخش ۳ RFC 3986 مراجعه کنید.
| قوانین اعتبارسنجی | |
|---|---|
| طرح |
مبدأهای جاوا اسکریپت باید از طرح HTTPS استفاده کنند، نه HTTP ساده. URIهای Localhost (ازجمله URIهای نشانی IP در localhost) از این قانون مستثنی هستند. |
| میزبان |
میزبانها نمیتوانند نشانیهای IP خام باشند. نشانیهای IP میزبان محلی از این قانون مستثنی هستند. |
| دامنه |
“googleusercontent.com” باشد.goo.gl) باشند،
مگر اینکه برنامه مالک دامنه باشد. |
| Userinfo |
مبدأهای جاوا اسکریپت نمیتواند حاوی زیرمؤلفه userinfo باشد. |
| مسیر |
مبدأهای جاوا اسکریپت نمیتوانند حاوی مؤلفه مسیر باشند. |
| پُرسمان |
مبدأهای جاوا اسکریپت نمیتوانند حاوی مؤلفه پُرسمان باشند. |
| Fragment |
مبدأهای جاوا اسکریپت نمیتوانند حاوی مؤلفه قطعه باشند. |
| شخصیتها |
مبدأهای جاوا اسکریپت نمیتوانند حاوی نویسههای خاصی باشند، ازجمله:
|
مجوزدهی افزایشی
در پروتکل OAuth 2.0، برنامه شما برای دسترسی به منابعی که با گسترهها شناسایی میشوند، درخواست مجوز میکند. بهترین روش تجربه کاربری این است که درخواست مجوز برای منابع را در زمانی که به آنها نیاز دارید انجام دهید. برای فعال کردن این روش، سرور مجوز Google از مجوز افزایشی پشتیبانی میکند. این ویژگی به شما امکان میدهد تا دامنهها را درصورت نیاز درخواست کنید و اگر کاربر اجازه دامنه جدید را اعطا کند، کد مجوزی را برمیگرداند که ممکن است با یک کد حاوی همه دامنههایی که کاربر به پروژه اعطا کرده است مبادله شود.
برای مثال، برنامهای که به افراد اجازه میدهد قطعههای موسیقی را نمونهبرداری کنند و میکس بسازند ممکن است در زمان ورود به سیستم به منابع بسیار کمی نیاز داشته باشد، شاید چیزی بیشتر از نام فردی که به سیستم وارد میشود نباشد. بااینحال، ذخیره کردن ترکیب کاملشده مستلزم دسترسی به Google Drive آنها است. اکثر افراد این را طبیعی میدانند که فقط زمانی از آنها درخواست دسترسی به Google Drive شود که برنامه واقعاً به آن نیاز دارد.
در این حالت، برنامه ممکن است در زمان ورود به سیستم، دامنههای openid و profile را برای انجام ورود به سیستم پایه درخواست کند و سپس در زمان اولین درخواست برای ذخیره ترکیب، دامنه https://www.googleapis.com/auth/drive.file را درخواست کند.
قوانین زیر برای کد دسترسی بهدستآمده از مجوز افزایشی اعمال میشود:
- از این توکن میتوان برای دسترسی به منابع مربوط به هریک از دامنههایی که در مجوز ترکیبی جدید گنجانده شدهاند استفاده کرد.
- وقتی از ژتون بازآوری برای مجوز ترکیبی جهت دریافت کد دسترسی استفاده میکنید،
کد دسترسی نشاندهنده مجوز ترکیبی است و میتوان از آن برای هرکدام از
مقادیر
scopeموجود در پاسخ استفاده کرد. - مجوز ترکیبی شامل همه دامنههایی است که کاربر به پروژه API اعطا کرده است، حتی اگر این اعطاها از مشتریان مختلف درخواست شده باشد. برای مثال، اگر کاربری بااستفاده از کارخواه میزکار برنامه به یک دامنه دسترسی اعطا کند و سپس ازطریق کارخواه تلفن همراه به همان برنامه دامنه دیگری اعطا کند، مجوز ترکیبی شامل هر دو دامنه خواهد بود.
- اگر توکنی را که نشاندهنده مجوز ترکیبی است لغو کنید، دسترسی به همه حوزههای آن مجوز ازطرف کاربر مرتبط بهطور همزمان لغو میشود.
نمونه کدهای زیر نحوه افزودن گستره به کد دسترسی موجود را نشان میدهد. این رویکرد به برنامه شما امکان میدهد از مدیریت چندین کد دسترسی اجتناب کند.
نقطههای پایانی OAuth 2.0
برای افزودن دامنهها به کد دسترسی موجود، پارامتر include_granted_scopes را در درخواستتان به سرور OAuth 2.0 در Google اضافه کنید.
تکهکد زیر نحوه انجام این کار را نشان میدهد. این قطعه کد فرض میکند که شما دامنههایی را که کد دسترسی شما برای آنها معتبر است در فضای ذخیرهسازی محلی مرورگر ذخیره کردهاید. (کد
نمونه کاملشده فهرستی از دامنههایی را که کد دسترسی برای آنها معتبر است
با تنظیم ویژگی oauth2-test-params.scope در فضای ذخیرهسازی محلی مرورگر
ذخیره میکند.)
این گزیده، دامنههایی را که کد دسترسی برای آنها معتبر است با دامنهای که میخواهید برای پُرسمان خاصی استفاده کنید مقایسه میکند. اگر کد دسترسی آن محدوده را پوشش ندهد، جریان OAuth 2.0 شروع میشود.
در اینجا، تابع oauth2SignIn همان تابعی است که در مرحله ۲ ارائه شد (و بعداً در نمونه کامل ارائه میشود).
var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly'; var params = JSON.parse(localStorage.getItem('oauth2-test-params')); var current_scope_granted = false; if (params.hasOwnProperty('scope')) { var scopes = params['scope'].split(' '); for (var s = 0; s < scopes.length; s++) { if (SCOPE == scopes[s]) { current_scope_granted = true; } } } if (!current_scope_granted) { oauth2SignIn(); // This function is defined elsewhere in this document. } else { // Since you already have access, you can proceed with the API request. }
ابطال کد
در برخی موارد، ممکن است کاربر بخواهد دسترسی اعطاشده به برنامهای را لغو کند. کاربر میتواند با مراجعه به تنظیمات حساب، دسترسی را لغو کند. برای اطلاعات بیشتر، به سند پشتیبانی برداشتن دسترسی سایت یا برنامه در بخش «برنامهها و سایتهای طرف سوم با امکان دسترسی به حساب شما» مراجعه کنید.
همچنین ممکن است برنامهای بهصورت برنامهنویسیشده دسترسی اعطاشده به خود را لغو کند. لغو برنامهای در مواردی که کاربر لغو اشتراک میکند، برنامهای را برمیدارد، یا منابع API موردنیاز برنامه بهطور قابلتوجهی تغییر کرده است مهم است. به عبارت دیگر، بخشی از فرایند برداشتن میتواند شامل درخواست API باشد تا اطمینان حاصل شود اجازههایی که قبلاً به برنامه اعطا شده است برداشته شود.
نقطههای پایانی OAuth 2.0
برای لغو کردن برنامهنویسیشده یک کد، برنامه شما درخواستی به
https://oauth2.googleapis.com/revoke ارسال میکند و کد را بهعنوان پارامتر اضافه میکند:
curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
https://oauth2.googleapis.com/revoke?token={token}این ژتون میتواند ژتون دسترسی یا ژتون بازآوری باشد. اگر کد از نوع کد دسترسی باشد و کد بازآوری متناظر داشته باشد، کد بازآوری نیز باطل خواهد شد.
اگر لغو با موفقیت پردازش شود، رمز وضعیت HTTP پاسخ
200 است. برای شرایط خطا، رمز وضعیت HTTP 400 بههمراه کد خطا برگردانده میشود.
قطعه کد جاوا اسکریپت زیر نشان میدهد که چگونه یک توکن را در جاوا اسکریپت بدون استفاده از
کتابخانه مشتری Google APIs برای جاوا اسکریپت لغو کنید. ازآنجاییکه نقطه پایانی OAuth 2.0 Google برای لغو کردن
نشانها از «همرسانی منابع میانمبدئی» (CORS) پشتیبانی نمیکند، کد فرمی ایجاد میکند و
فرم را بهجای استفاده از روش XMLHttpRequest() برای پست کردن درخواست، به نقطه پایانی ارسال میکند.
function revokeAccess(accessToken) { // Google's OAuth 2.0 endpoint for revoking access tokens. var revokeTokenEndpoint = 'https://oauth2.googleapis.com/revoke'; // Create <form> element to use to POST data to the OAuth 2.0 endpoint. var form = document.createElement('form'); form.setAttribute('method', 'post'); form.setAttribute('action', revokeTokenEndpoint); // Add access token to the form so it is set as value of 'token' parameter. // This corresponds to the sample curl request, where the URL is: // https://oauth2.googleapis.com/revoke?token={token} var tokenField = document.createElement('input'); tokenField.setAttribute('type', 'hidden'); tokenField.setAttribute('name', 'token'); tokenField.setAttribute('value', accessToken); form.appendChild(tokenField); // Add form to page and submit it to actually revoke the token. document.body.appendChild(form); form.submit(); }
پیادهسازی «محافظت بینحسابی»
اقدام دیگری که باید برای محافظت از حسابهای کاربرانتان انجام دهید، پیادهسازی «محافظت بینحسابی» بااستفاده از «سرویس محافظت بینحسابی» Google است. این سرویس به شما امکان میدهد در اعلانهای رویداد امنیتی مشترک شوید که اطلاعاتی درباره تغییرات عمده در حساب کاربر به برنامهتان ارائه میدهد. سپس میتوانید از این اطلاعات برای اقدام کردن بسته به نحوه تصمیمگیریتان برای پاسخ دادن به رویدادها استفاده کنید.
برخیاز نمونههای انواع رویدادهایی که «سرویس محافظت بینحسابی» Google به برنامهتان ارسال میکند عبارتاند از:
-
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked -
https://schemas.openid.net/secevent/oauth/event-type/token-revoked -
https://schemas.openid.net/secevent/risc/event-type/account-disabled
برای کسب اطلاعات بیشتر درباره نحوه پیادهسازی «محافظت بینحسابی» و فهرست کامل رویدادهای دردسترس، به صفحه «محافظت از حسابهای کاربری با محافظت بینحسابی» مراجعه کنید.