این سند توضیح میدهد که چگونه برنامههای رایانهای (مانند برنامههایی که در Windows، macOS، یا Linux اجرا میشوند، یا ابزارهای میانای خط فرمان (CLI)) از نقطههای پایانی OAuth 2.0 Google برای مجاز کردن دسترسی به میاناهای برنامهسازی کاربردی Google استفاده میکنند.
OAuth 2.0 به کاربران اجازه میدهد دادههای خاصی را با برنامهای همرسانی کنند و درعینحال نامهای کاربری، گذرواژهها، و سایر اطلاعاتشان را خصوصی نگه دارند. برای مثال، یک برنامه میتواند از OAuth 2.0 برای دریافت اجازه از کاربران برای ذخیره فایلها در Google Drive آنها استفاده کند.
برنامههای رایانه بهصورت محلی در دستگاه کاربر نصب میشوند (مانند نرمافزار رایانه مستقل، ابزارهای CLI توسعهدهنده، ابزارهای کمکی همگامسازی پسزمینه، یا اسکریپتها). چون این برنامهها در دستگاههای جداگانه توزیع میشوند، فرض بر این است که این برنامهها نمیتوانند اطلاعات محرمانه را حفظ کنند (آنها کلاینتهای عمومی هستند). این برنامهها میتوانند درحالیکه کاربر بهطور فعال با برنامه تعامل دارد یا زمانی که برنامه در پسزمینه اجرا میشود، به میاناهای برنامهسازی کاربردی Google دسترسی داشته باشند.
این جریان مجوز مشابه جریانی است که برای برنامههای سرور وب استفاده میشود. تفاوت اصلی این است که برنامههای رایانهای باید مرورگر سیستم را باز کنند و یک URI تغییرمسیر محلی (مانند نشانی IP حلقه برگشت) ارائه دهند تا پاسخهای سرور مجوز Google را مدیریت کنند.
کتابخانهها و نمونهها
توصیه میکنیم هنگام پیادهسازی OAuth 2.0 برای برنامههای رایانه، از «کتابخانههای کارخواه Google API» برای زبان برنامهنویسیتان (مثلاً Python، Java، Node.js، Go، .NET) استفاده کنید. کتابخانههای کارخواه، مدیریت توکن و مجوز کاربر را انجام میدهند و پیادهسازی را سادهتر و کمتر مستعد خطا میکنند تا اینکه مستقیماً از نقاط پایانی HTTP/REST سطح پایینتر استفاده شود.
برای برنامههای تلفن همراه، راهنماهای صدور مجوز Android و iOS را ببینید.
برای برنامههایی که در دستگاههایی اجرا میشوند که از مرورگر سیستم پشتیبانی نمیکنند یا قابلیتهای ورودی محدودی دارند، مانند تلویزیونها، کنسولهای بازی، دوربینها، یا چاپگرها، به OAuth 2.0 برای تلویزیونها و دستگاهها یا ورود به سیستم در تلویزیونها و دستگاههای ورودی محدود مراجعه کنید.
پیشنیازها
فعال کردن میاناهای برنامهسازی کاربردی برای پروژه
هر برنامهای که میاناهای برنامهسازی کاربردی Google را فراخوانی میکند باید آن میاناهای برنامهسازی کاربردی را در «کنسول میانای برنامهسازی کاربردی» فعال کند.
برای فعال کردن میانای برنامهسازی کاربردی برای پروژهتان:
- کتابخانه میانای برنامهسازی کاربردی را در «کنسول Google API» باز کنید.
- اگر درخواست شد، پروژهای را انتخاب کنید یا پروژه جدیدی ایجاد کنید.
- «کتابخانه میانای برنامهسازی کاربردی» همه میاناهای برنامهسازی کاربردی دردسترس را براساس خانواده محصول و محبوبیت گروهبندی میکند. اگر API موردنظرتان برای فعال کردن در فهرست دیده نمیشود، از جستجو برای پیدا کردن آن استفاده کنید، یا در خانواده محصولی که به آن تعلق دارد روی مشاهده همه کلیک کنید.
- میانای برنامهسازی کاربردی موردنظرتان را برای فعال کردن انتخاب کنید، سپس روی دکمه فعال کردن کلیک کنید.
- اگر درخواست شد، صدور صورتحساب را فعال کنید.
- درصورت درخواست، «شرایط خدمات» API را بخوانید و بپذیرید.
ایجاد اعتبارنامه مجوز
هر برنامهای که از OAuth 2.0 برای دسترسی به Google API استفاده میکند باید اعتبارنامه مجوزی داشته باشد که برنامه را برای سرور OAuth 2.0 Google شناسایی کند. مراحل زیر نحوه ایجاد اطلاعات اعتباری برای پروژه را توضیح میدهد. سپس برنامههایتان میتوانند از این اطلاعات اعتباری برای دسترسی به میاناهای برنامهسازی کاربردیای که برای آن پروژه فعال کردهاید استفاده کنند.
- به صفحه کارخواهان بروید.
- روی ایجاد کارخواه کلیک کنید.
- نوع برنامه برنامه رایانهای را انتخاب کنید.
- در فیلد نام، نامی برای کارخواه OAuth وارد کنید. این نام در صفحه کارخواهان پروژهتان نمایش داده میشود تا کارخواه را شناسایی کند.
- روی ایجاد کردن کلیک کنید.
شناسه کارخواه و رمز کارخواه شما در کنسول Google Cloud تولید و نمایش داده میشود. برنامههای رایانهای کارخواههای عمومی هستند و نمیتوانند اسرار را محرمانه نگه دارند. همیشه هنگام درخواست کدهای مجوز از PKCE (کلید اثبات برای تبادل کد) استفاده کنید.
شناسایی کردن دامنههای دسترسی
گسترهها به برنامه شما امکان میدهند فقط به منابعی که نیاز دارد درخواست دسترسی دهد و درعینحال به کاربران امکان میدهند میزان دسترسیای را که به برنامه شما اعطا میکنند کنترل کنند. بنابراین، ممکن است بین تعداد گسترههای درخواستی و احتمال دریافت رضایت کاربر رابطه معکوس وجود داشته باشد.
قبلاز شروع پیادهسازی مجوز OAuth 2.0، توصیه میکنیم دامنههایی را که برنامهتان برای دسترسی به آنها نیاز به اجازه دارد شناسایی کنید.
سند OAuth 2.0 API Scopes حاوی فهرست کاملی از دامنههایی است که ممکن است برای دسترسی به Google API استفاده کنید.
دریافت کدهای دسترسی OAuth 2.0
مراحل زیر نشان میدهد که برنامه شما چگونه با سرور OAuth 2.0 Google تعامل میکند تا رضایت کاربر را برای انجام درخواست میانای برنامهسازی کاربردی ازطرف کاربر دریافت کند. برنامه شما باید قبلاز اجرای درخواست Google API که به مجوز کاربر نیاز دارد، این رضایت را داشته باشد.
مرحله ۱: تولید کد درستیسنجی و چالش
Google از پروتکل کلید اثبات برای تبادل کد (PKCE) پشتیبانی میکند تا جریان برنامه نصبشده را ایمنتر کند. برای هر درخواست مجوز، یک کد درستیسنجی منحصربهفرد ایجاد میشود و مقدار تبدیلشده آن که «code_challenge» نامیده میشود، برای دریافت کد مجوز به سرور مجوز ارسال میشود.
ایجاد کردن کد درستیسنجی
code_verifier یک رشته تصادفی رمزنگاری با آنتروپی بالا است که از نویسههای غیررزروشده
[A-Z] / [a-z] / [0-9] / "-" / "." / "_" / "~" استفاده میکند و حداقل طول آن ۴۳ نویسه
و حداکثر طول آن ۱۲۸ نویسه است.
درستیسنج کد باید آنتروپی کافی داشته باشد تا حدس زدن مقدار آن غیرممکن شود.
ایجاد چالش کد
دو روش برای ایجاد چالش کد پشتیبانی میشود.
| روشهای تولید چالش کد | |
|---|---|
| S256 (توصیهشده) | چالش کد، درهمسازی SHA256 کدبندیشده Base64URL (بدون لایهگذاری) از تأییدکننده کد است.
|
| plain | چالش کد همان مقدار تأییدکننده کد است که در بالا تولید شده است.
|
مرحله ۲: ارسال درخواست به سرور OAuth 2.0 در Google
برای دریافت مجوز کاربر، درخواستی به سرور مجوز Google در
https://accounts.google.com/o/oauth2/v2/auth ارسال کنید. این نقطه پایانی جستجوی جلسه فعال را مدیریت میکند،
کاربر را اصالتسنجی میکند، و رضایت کاربر را دریافت میکند. نقطه پایان فقط ازطریق SSL قابلدسترسی است و
اتصالهای HTTP (غیر SSL) را رد میکند.
سرور مجوز از پارامترهای رشته پُرسمان زیر برای برنامههای نصبشده پشتیبانی میکند:
| پارامترها | |||||||
|---|---|---|---|---|---|---|---|
client_id |
الزامی
شناسه کارخواه برای برنامه شما. میتوانید این مقدار را در صفحه «کارخواهها» در «کنسول Cloud» پیدا کنید. |
||||||
redirect_uri |
الزامی
تعیین میکند که سرور مجوز Google چگونه پاسخی به برنامه شما ارسال کند. چندین گزینه تغییرمسیر برای برنامههای نصبشده دردسترس است و شما باید اعتبارنامههای مجوز خود را با روش تغییرمسیر خاصی در ذهن تنظیم کنید. این مقدار باید دقیقاً با یکی از URIهای هدایت مجاز برای کارخواه OAuth 2.0 که در صفحه کارخواهها در Cloud Console کارخواه پیکربندی کردهاید مطابقت داشته باشد. اگر این مقدار با شناسه منبع یکسان مجاز مطابقت نداشته باشد، خطای جدول زیر مقدار پارامتر
|
||||||
response_type |
الزامی
تعیین میکند که آیا نقطه پایان Google OAuth 2.0 کد مجوز برمیگرداند یا نه. مقدار پارامتر را برای برنامههای نصبشده روی |
||||||
scope |
الزامی
فهرستی از حوزهها که با فاصله از هم جدا شدهاند و منابعی را که برنامه شما میتواند ازطرف کاربر به آنها دسترسی داشته باشد شناسایی میکند. این مقادیر به صفحه رضایت که Google به کاربر نمایش میدهد اطلاعرسانی میکند. گسترهها به برنامه شما امکان میدهند فقط به منابعی که نیاز دارد دسترسی داشته باشد و درعینحال به کاربران امکان میدهند میزان دسترسیای را که به برنامه شما میدهند کنترل کنند. بنابراین، رابطهای معکوس بین تعداد دامنههای درخواستی و احتمال کسب رضایت کاربر وجود دارد. |
||||||
code_challenge |
توصیهشده
|
||||||
code_challenge_method |
توصیهشده
مشخص میکند از چه روشی برای کدبندی |
||||||
state |
توصیهشده
هر مقدار رشتهای را که برنامه شما برای حفظ وضعیت بین درخواست مجوز شما و پاسخ سرور مجوز استفاده میکند، مشخص میکند.
سرور مقدار دقیقی را که بهعنوان جفت میتوانید از این پارامتر برای اهداف مختلفی استفاده کنید، ازجمله هدایت کاربر به
منبع صحیح در برنامهتان، ارسال نانس، و کاهش جعل درخواست
بینسایتی. ازآنجاییکه |
||||||
login_hint |
اختیاری
اگر برنامه شما میداند کدام کاربر درحال تلاش برای اصالتسنجی است، میتواند از این پارامتر برای ارائه راهنمایی به «سرور اصالتسنجی Google» استفاده کند. سرور از این راهنمایی برای ساده کردن جریان ورود به سیستم استفاده میکند، یا با پیشتکمیل کردن فیلد ایمیل در فرم ورود به سیستم یا با انتخاب جلسه چندورودی مناسب. مقدار پارامتر را روی نشانی ایمیل یا شناسه |
||||||
نشانیهای وب نمونه برای صدور مجوز
برگههای زیر نمونه نشانیهای وب مجوز را برای گزینههای مختلف URI هدایت نشان میدهند.
نشانیهای وب یکسان هستند، بهجز مقدار پارامتر redirect_uri. نشانیهای وب
همچنین حاوی پارامترهای الزامی response_type و client_id و
پارامتر اختیاری state هستند. هر نشانی وب حاوی شکست خط و فاصله برای خوانایی است.
طرحواره URI سفارشی
https://accounts.google.com/o/oauth2/v2/auth? scope=email%20profile& response_type=code& state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken& redirect_uri=com.example.app%3A/oauth2redirect& client_id=client_id
نشانی IP مسیریابی بازگشتی
https://accounts.google.com/o/oauth2/v2/auth? scope=email%20profile& response_type=code& state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken& redirect_uri=http%3A//127.0.0.1%3A9004& client_id=client_id
مرحله ۳: 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 Foundation استفاده کنند.
توسعهدهندگان وب ممکن است با این خطا مواجه شوند وقتی برنامه iOS یا macOS پیوند وب عمومی را در
نماینده کاربر جاسازیشده باز میکند و کاربر از سایت شما به نقطه پایانی مجوز OAuth 2.0 Google
میرود. توسعهدهندگان باید اجازه دهند پیوندهای عمومی در کنترلکننده پیوند پیشفرض سیستمعامل باز شود که شامل کنترلکنندههای
پیوندهای جامع
یا برنامه مرورگر پیشفرض میشود. کتابخانه
SFSafariViewController
نیز گزینهای پشتیبانیشده است.
org_internal
شناسه کارخواه OAuth در درخواست بخشی از پروژهای است که دسترسی به «حسابهای Google» را در سازمان Google Cloud خاصی محدود میکند. برای اطلاعات بیشتر درباره این گزینه پیکربندی، به بخش نوع کاربر در مقاله راهنمای «راهاندازی صفحه رضایت OAuth» مراجعه کنید.
deleted_client
کارخواه OAuth که برای درخواست استفاده میشود حذف شده است. حذف میتواند بهصورت دستی یا بهطور خودکار درصورت استفاده نشدن از کارخواهها انجام شود. مشتریان حذفشده را میتوان ظرف ۳۰ روز پساز حذف بازیابی کرد. بیشتر بدانید .
invalid_grant
اگر از
درستیسنج کد و
چالش استفاده میکنید، پارامتر code_callenge نامعتبر است یا وجود ندارد. مطمئن شوید که پارامتر
code_challenge بهدرستی تنظیم شده باشد.
هنگام بازآوری کد دسترسی، ممکن است کد منقضی شده باشد یا نامعتبر شده باشد. دوباره کاربر را اصالتسنجی کنید و برای دریافت کردن توکنهای جدید از کاربر رضایت بگیرید. اگر همچنان این خطا را میبینید، مطمئن شوید که برنامهتان بهدرستی پیکربندی شده است و از نشانها و پارامترهای صحیح در درخواستتان استفاده میکنید. درغیراینصورت، ممکن است حساب کاربر حذف یا غیرفعال شده باشد.
redirect_uri_mismatch
redirect_uri ارسالشده در درخواست مجوز با نشانی وب هدایت مجاز برای شناسه کارخواه OAuth مطابقت ندارد. URIهای هدایت مجاز را در
Google Cloud Console
صفحه کارخواهها مرور کنید.
redirect_uri ارسالشده ممکن است برای نوع کارخواه نامعتبر باشد.
پارامتر redirect_uri ممکن است به جریان OAuth خارجاز باند (OOB) اشاره داشته باشد که
منسوخ شده است و دیگر پشتیبانی نمیشود. برای بهروزرسانی ادغام، به
راهنمای انتقال مراجعه کنید.
invalid_request
مشکلی در درخواست شما وجود داشت. این مشکل ممکن است به چند دلیل باشد:
- درخواست بهدرستی قالببندی نشده بود
- پارامترهای الزامی در درخواست وجود نداشت
- درخواست از روش صدور مجوزی استفاده میکند که Google از آن پشتیبانی نمیکند. تأیید کنید که ادغام OAuth شما از روش ادغام توصیهشده استفاده میکند
- از طرح سفارشی پشتیبانینشدهای برای شناسه منبع یکسان تغییرمسیر استفاده شده است. اگر پیام خطای طرحواره URI سفارشی در برنامههای Android یا Chrome پشتیبانی نمیشود را میبینید، درباره جایگزینهای طرحواره URI سفارشی بیشتر بدانید.
مرحله ۴: رسیدگی به پاسخ سرور OAuth 2.0
روشی که برنامه شما پاسخ مجوز را دریافت میکند به
طرحواره URI تغییرمسیر که استفاده میکند بستگی دارد. صرفنظر از طرح، پاسخ حاوی کد مجوز (code) یا خطا (error) خواهد بود. برای مثال، error=access_denied نشان میدهد که کاربر درخواست را رد کرده است.
اگر کاربر به برنامه شما اجازه دسترسی بدهد، میتوانید کد مجوز را با کد دسترسی و ژتون بازآوری معاوضه کنید (همانطور که در مرحله بعد توضیح داده شده است).
مرحله ۵: معاوضه کد مجوز با ژتونهای بازآوری و دسترسی
برای معاوضه کد مجوز با کد دسترسی، نقطه پایانی https://oauth2.googleapis.com/token را فراخوانی کنید و پارامترهای زیر را تنظیم کنید:
| فیلدها | |
|---|---|
client_id |
شناسه کارخواه بهدستآمده از صفحه کارخواهها در «کنسول Cloud». |
client_secret |
اختیاری
رمز کارخواه بهدستآمده از صفحه کارخواهها در «کنسول Cloud». |
code |
کد مجوز برگشتدادهشده از درخواست اولیه. |
code_verifier |
کد درستیسنجی که در مرحله ۱ ایجاد کردید. |
grant_type |
همانطور که در مشخصات OAuth 2.0 تعریف شده است، مقدار این فیلد باید روی authorization_code تنظیم شود. |
redirect_uri |
یکی از URIهای هدایت فهرستشده برای پروژهتان در
صفحه کارخواهها در Cloud Console
برای
client_id دادهشده. |
هرچند استفاده از DPoP اختیاری است، اما برای افزایش امنیت توصیه میشود. امنیت DPoP به محدود بودن کلید خصوصی به یک دستگاه بستگی دارد؛ توصیه میکنیم آن را بهگونهای ذخیره کنید که نتوان آن را از دستگاه کپی کرد، مثلاً بااستفاده از TPM، Secure Enclave، یا دیگر محلهای ذخیره کلید با پشتیبانی سختافزاری. برای استفاده از DPoP، برنامه شما باید برای هر درخواست به نقطه پایانی توکن، یک JWT اثبات DPoP جدید و منحصربهفرد تولید کند و آن را بهعنوان سرصفحه درخواست HTTP اضافه کند.
| سرایند | الزامی | شرح |
|---|---|---|
DPoP |
اختیاری | اثبات DPoP یک JWT است که
مالکیت کلید خصوصی را اثبات میکند. این سرصفحه است، نه پارامتر. درصورت ارائه، نشانهای برگرداندهشده
به این کلید محدود میشوند. برای هر درخواست باید مدرک جدید و منحصربهفردی تولید شود و باید شامل ادعاهای htm (روش HTTP) و htu (شناسه منبع یکسان HTTP) باشد که با درخواست مطابقت داشته باشد. |
قطعه کد زیر یک درخواست نمونه را نشان میدهد:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6IkVTMjU2IiwiandrIjp7Imt0eSI6Ik\ VDIiwieCI6Imw4dEZyaHgtMzR0VjNoUklDUkRZOXpDa0RscEJoRjQyVVFVZldWQVdCR\ nMiLCJ5IjoiOVZFNGpmX09rX282NHpiVFRsY3VOSmFqSG10NnY5VERWclUwQ2R2R1JE\ QSIsImNydiI6IlAtMjU2In19.eyJqdGkiOiItQndDM0VTYzZhY2MybFRjIiwiaHRtIj\ oiUE9TVCIsImh0dSI6Imh0dHBzOi8vc2VydmVyLmV4YW1wbGUuY29tL3Rva2VuIiwia\ WF0IjoxNTYyMjYyNjE2fQ.2-GxA6T8lP4vfrg8v-FdWP0A0zdrj8igiMLvqRMUvwnQg\ 4PtFLbdLXiOSsX0x7NVY-FNyJK70nfbV37xRZT3Lg code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& client_id=your_client_id& redirect_uri=http://127.0.0.1:9004& grant_type=authorization_code
ساختن اثبات DPoP
مراحل زیر نحوه ساختن اثبات DPoP بااستفاده از OpenSSL از خط فرمان را نشان میدهد:
- تولید جفت کلید EC P-256:
openssl ecparam -name prime256v1 -genkey -noout -out dpop_private.pem openssl ec -in dpop_private.pem -pubout -out dpop_public.pem
- ایجاد سرصفحه DPoP:
سرصفحه باید شامل ادعاهای
typ،alg، وjwk(کلید عمومی) باشد. مقادیرxوyمختصات کدبندیشده Base64Url کلید عمومی EC شما هستند. این JSON را با Base64Url کدبندی کنید:{ "typ":"dpop+jwt", "alg":"ES256", "jwk": { "kty":"EC", "x":"YOUR_PUBLIC_KEY_X", "y":"YOUR_PUBLIC_KEY_Y", "crv":"P-256" } } - ایجاد بار داده DPoP:
بار داده باید شامل
jti(شناسه یکتا برای درخواست)،htm(روش HTTP، مثلاًPOST)،htu(HTTP URI، مثلاًhttps://oauth2.googleapis.com/token)، وiat(زمان صدور) باشد. اگر در پاسخ به درخواست قبلی، یک nonce از سرور در سرصفحهDPoP-Nonceدریافت کردید، باید آن مقدار nonce را در ادعایnonceاضافه کنید. ادعای nonce برای تبادل کد مجوز اختیاری است و فقط زمانی استفاده میشود که سرایند DPoP-Nonce قبلاً دریافت شده باشد. این JSON را با Base64Url کدبندی کنید:{ "jti":"JTI_VALUE", "htm":"POST", "htu":"https://oauth2.googleapis.com/token", "iat":YOUR_JWT_ISSUED_TIME, "nonce":"SERVER_PROVIDED_NONCE" }مقدار
jtiبه نوع مبادله بستگی دارد:- برای تبادل کد مجوز،
jtiباید درهمسازی SHA256 کدبندیشده با Base64Url از کد مجوز باشد:"jti":"BASE64URL(SHA256(AUTHORIZATION_CODE))". - برای تبادل ژتون بازآوری،
jtiباید یک شناسه یکتا برای هر درخواست باشد:"jti":"YOUR_UNIQUE_PER_REQUEST_IDENTIFIER".
- برای تبادل کد مجوز،
- امضا کردن مدرک:
سرصفحه و بار داده کدگذاریشده را با نقطه (
.) بههم متصل کنید، سپس نتیجه را با کلید خصوصیتان بااستفاده از ES256 امضا کنید. توجه داشته باشید که JWS الزام میکند که امضا در قالب خامR | Sبههمپیوسته باشد (۶۴ بایت برای P-256). اگر مستقیماً از OpenSSL استفاده میکنید، باید امضای پیشفرض ASN.1 DER-encoded را به این قالب خام تبدیل کنید.
تبادل موفق با پاسخ 200 OK حاوی کدها نشان داده میشود. اگر درطول تبادل از اثبات DPoP معتبری استفاده شود، کد بازآوری که Google برمیگرداند به کلید شما محدود به DPoP خواهد بود، اما کدهای دسترسی محدود به DPoP نخواهند بود. کدهای دسترسی بهجای DPoP، token_type مربوط به Bearer را حفظ خواهند کرد.
علاوهبراین، Google سرصفحه HTTP DPoP-Nonce را در پاسخ برمیگرداند.
کارخواه شما باید این عدد یکبارمصرف را ذخیره کند و آن را در ادعای nonce اثبات DPoP
در درخواستهای بعدی (مانند هنگام تبادل یک کد بازآوری برای یک کد دسترسی جدید، یا هنگام
فراخوانی میاناهای برنامهسازی کاربردی محافظتشده با DPoP) قرار دهد. بااستفاده از این عدد یکبارمصرف صادرشده زودهنگام، میتوانید از خطای رفتوبرگشت اضافی (use_dpop_nonce) در درخواست بعدیتان جلوگیری کنید.
برای درخواستهای تبادل ژتون که با ژتونهای بازآوری محدودشده با DPoP انجام میشود، باید اثباتهای DPoP اضافه شود.
اگر سرایند DPoP در زمان موردانتظار وجود نداشته باشد، نامعتبر باشد، یا اگر مدرک از کلیدی متفاوت با کلید محدودشده به کد استفاده کند، تبادل ناموفق رخ میدهد. در این موارد، سرور خطای
400 Bad Request را برمیگرداند.
اگر اثبات DPoP دارای ادعاهای htm یا htu نامطابق، iat منقضیشده، jti دوباره استفادهشده، یا امضای نامعتبر باشد، Google کد خطای invalid_dpop_proof را برمیگرداند.
اگر یک DPoP nonce لازم باشد، مثلاً درطول تبادل ژتون بازآوری، و اثبات DPoP فاقد ادعای nonce باشد، یا مقدار nonce برای سرور غیرقابلقبول باشد (مثلاً منقضی شده باشد، قبلاً استفاده شده باشد، یا نادرست باشد)، Google کد خطای use_dpop_nonce را بههمراه سرصفحه HTTP DPoP-Nonce حاوی یک nonce جدید برمیگرداند که میتوانید در درخواست بعدی استفاده کنید.
خطاهای دیگر ممکن است invalid_grant را برگرداند.
Google با برگرداندن شیء JSON که حاوی کد دسترسی کوتاهمدت و کد بازآوری است به این درخواست پاسخ میدهد.
پاسخ حاوی فیلدهای زیر است:
| فیلدها | |
|---|---|
access_token |
نشانهای که برنامه شما برای صدور مجوز درخواست Google API ارسال میکند. |
expires_in |
مدتزمان باقیمانده کد دسترسی برحسب ثانیه. |
id_token |
توجه: این ویژگی فقط درصورتی برگردانده میشود که درخواست شما شامل دامنه هویتی باشد،
مانند openid، profile، یا email. این مقدار یک
JSON Web Token (JWT) است که حاوی اطلاعات هویتی امضاشده دیجیتالی درباره
کاربر است. |
refresh_token |
نشانهای که میتوانید از آن برای دریافت نشانه دسترسی جدید استفاده کنید. ژتونهای بازآوری تا زمانی معتبر هستند که کاربر دسترسی را لغو کند یا ژتون بازآوری منقضی شود. اگر از DPoP استفاده شده باشد، ژتون بازآوری به کلید خصوصی استفادهشده برای امضای اثبات DPoP محدود میشود. توجه داشته باشید که ژتونهای بازآوری همیشه برای برنامههای نصبشده برگردانده میشوند. |
refresh_token_expires_in |
طول عمر باقیمانده ژتون بازآوری به ثانیه. این مقدار فقط زمانی تنظیم میشود که کاربر دسترسی زماندار اعطا کند. |
scope |
دامنههای دسترسی اعطاشده توسط access_token بهصورت فهرستی از
رشتههای حساس به حروف بزرگ و کوچک که با فاصله از هم جدا شدهاند بیان میشود. |
token_type |
نوع کد برگرداندهشده. این مقدار همیشه Bearer است، حتی وقتی از DPoP استفاده میشود. |
تکهکد زیر نمونهای از سرایندها و متن پاسخ موفقیتآمیز را هنگام استفاده از DPoP نشان میدهد:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
DPoP-Nonce: AN3XwJjZsjnb0ZuWkRlek8QU7wY-Zhf-5IP6tO0tORz0KgtDT1Bo8FX-w4nz3r5lnepI
{
"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 Workspace Enterprise با واگذاری اختیارات در سراسر دامنه، یا برنامههایی که بهعنوان مورد اعتماد علامتگذاری شدهاند، صفحه رضایت اجازههای ریزدانه را دور میزنند. برای این برنامهها، کاربران صفحه رضایت اجازه دانهای را نخواهند دید. درعوض، برنامهتان یا همه گسترههای درخواستشده را دریافت میکند یا هیچکدام را دریافت نمیکند.
برای اطلاعات دقیقتر، نحوه مدیریت اجازههای ریزدانه را ببینید.
برای بررسی اینکه آیا کاربر به برنامه شما اجازه دسترسی به دامنه خاصی را داده است یا نه،
فیلد 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
پساز اینکه برنامهتان کد دسترسی را دریافت کرد، میتوانید از این کد برای برقراری تماس با Google API ازطرف حساب کاربری مشخصی استفاده کنید، بهشرطی که گستره(های) دسترسی موردنیاز API اعطا شده باشد. برای انجام این کار،
کد دسترسی را با گنجاندن پارامتر پُرسمان access_token یا مقدار سرصفحه HTTP Authorization در درخواست به میانای برنامهسازی کاربردی بگنجانید.Bearer درصورت امکان،
سرصفحه HTTP ترجیح داده میشود، زیرا رشتههای پرسمان معمولاً در گزارشهای سرور قابلمشاهده هستند. در بیشتر موارد میتوانید از کتابخانه کارخواه برای راهاندازی فراخوانیهایتان به Google APIs استفاده کنید (برای مثال، هنگام فراخوانی Drive Files API).
میتوانید همه میاناهای برنامهسازی کاربردی Google را امتحان کنید و دامنههای آنها را در OAuth 2.0 Playground مشاهده کنید.
نمونههای HTTP GET
فراخوانی نقطه پایانی
drive.files (Drive Files API) بااستفاده از سرصفحه Authorization: Bearer HTTP
ممکن است شبیه به این باشد. توجه داشته باشید که باید کد دسترسی خودتان را مشخص کنید:
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
بازآوری کد دسترسی
کدهای دسترسی بهطور دورهای منقضی میشوند و به اطلاعات اعتباری نامعتبر برای درخواست API مربوطه تبدیل میشوند. اگر دسترسی آفلاین به گسترههای مرتبط با کد دسترسی را درخواست کرده باشید، میتوانید کد دسترسی را بدون درخواست اجازه از کاربر (ازجمله زمانی که کاربر حضور ندارد) بازآوری کنید.
برای بازآوری کد دسترسی، برنامهتان درخواست HTTPS POST
به سرور مجوز Google (https://oauth2.googleapis.com/token) ارسال میکند که
شامل پارامترهای زیر در بدنه درخواست است:
| نام | مقدار |
|---|---|
client_id |
شناسه مشتری بهدستآمده از کنسول API. |
client_secret |
اختیاری
رمز کارخواه بهدستآمده از کنسول API.
( |
grant_type |
همانطور که
در
مشخصات OAuth 2.0 تعریف شده است،
مقدار این فیلد باید روی refresh_token تنظیم شود. |
refresh_token |
نماد بازآوری از تبادل کد مجوز برگردانده شد. |
هرچند استفاده از DPoP اختیاری است، اما برای افزایش امنیت توصیه میشود. برای استفاده از DPoP با ژتون بازآوری، برنامه شما باید برای هر درخواست به نقطه پایانی ژتون، یک JWT اثبات DPoP جدید و منحصربهفرد تولید کند. این مدرک باید با همان کلید خصوصیای امضا شود که درطول تبادل اولیه کد مجوز استفاده شده است. برنامه شما مدرک را بهعنوان سرایند درخواست HTTP اضافه میکند.
| سرایند | الزامی | شرح |
|---|---|---|
DPoP |
اختیاری | اثبات DPoP یک JWT است که
مالکیت کلید خصوصی را اثبات میکند. این سرصفحه است، نه پارامتر. درصورت ارائه، نشانهای برگرداندهشده
به این کلید محدود میشوند. برای هر درخواست باید مدرک جدید و منحصربهفردی تولید شود و باید شامل ادعاهای htm (روش HTTP) و htu (شناسه منبع یکسان HTTP) باشد که با درخواست مطابقت داشته باشد. |
قطعه کد زیر یک درخواست نمونه را نشان میدهد:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded DPoP: DPOP_PROOF_JWT client_id=your_client_id& refresh_token=refresh_token& grant_type=refresh_token
برای استفاده از DPoP با ژتون بازآوری، باید JWT اثبات DPoP جدید و منحصربهفردی برای درخواست تولید کنید. برای دستورالعملهای گامبهگام درباره تولید جفت کلید و ساختن JWT، به ساختن اثبات DPoP مراجعه کنید.
تبادل موفق با پاسخ 200 OK
حاوی کد دسترسی جدید نشان داده میشود. وقتی از DPoP استفاده میشود،
token_type Bearer است. پاسخ موفقیتآمیز تأیید میکند که
اثبات DPoP برای ژتون بازآوری پذیرفته شده است. Google همچنین ممکن است سرصفحه HTTP جدید DPoP-Nonce را در پاسخ برگرداند؛ درصورت برگردانده شدن، کارخواه شما باید این nonce را در حافظه نهان ذخیره کند و آن را در ادعای nonce اثبات DPoP در درخواستهای بعدی لحاظ کند.
اگر سرایند DPoP وجود نداشته باشد، نامعتبر باشد، یا از کلید نادرستی استفاده کند، تبادل ناموفق رخ میدهد. برای جزئیات مربوط به کدهای خطای خاص DPoP و مدیریت نانسها، به تبادل ناموفق مراجعه کنید.
تکهکد زیر نمونهای از سرایندها و متن پاسخ موفقیتآمیز را هنگام استفاده از DPoP نشان میدهد:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
DPoP-Nonce: AN3XwJjZsjnb0ZuWkRlek8QU7wY-Zhf-5IP6tO0tORz0KgtDT1Bo8FX-w4nz3r5lnepI
{
"access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
"expires_in": 3920,
"scope": "https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/calendar.readonly",
"token_type": "Bearer"
}توجه داشته باشید که تعداد ژتونهای بازآوری که صادر میشود محدود است؛ یک محدودیت برای هر ترکیب مشتری/کاربر، و محدودیت دیگر برای هر کاربر در همه مشتریها. باید کدهای بازآوری را در فضای ذخیرهسازی بلندمدت ذخیره کنید و تا زمانی که معتبر هستند از آنها استفاده کنید. اگر برنامه شما ژتونهای بازآوری زیادی درخواست کند، ممکن است با این محدودیتها مواجه شود که در این صورت ژتونهای بازآوری قدیمیتر از کار خواهند افتاد.
ابطال کد
در برخی موارد، ممکن است کاربر بخواهد دسترسی اعطاشده به برنامهای را لغو کند. کاربر میتواند با مراجعه به تنظیمات حساب، دسترسی را لغو کند. برای اطلاعات بیشتر، به سند پشتیبانی برداشتن دسترسی سایت یا برنامه در بخش «برنامهها و سایتهای طرف سوم با امکان دسترسی به حساب شما» مراجعه کنید.
همچنین این امکان وجود دارد که برنامه بهصورت برنامهنویسیشده دسترسی اعطاشده به آن را لغو کند. لغو برنامهای در مواردی که کاربر اشتراک را لغو میکند، برنامهای را برمیدارد، یا منابع API موردنیاز برنامه بهطور قابلتوجهی تغییر کرده است مهم است. بهعبارت دیگر، بخشی از فرایند برداشتن میتواند شامل درخواست API برای اطمینان از برداشته شدن اجازههایی باشد که قبلاً به برنامه اعطا شده است.
برای لغو کردن توکن بهصورت برنامهنویسیشده، برنامه شما درخواستی به
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 بههمراه کد خطا برگردانده میشود.
روشهای هدایت مجدد برنامه
طرحواره URI سفارشی
طرحوارههای URI سفارشی نوعی پیوند عمیق هستند که از طرحواره تعریفشده سفارشی برای باز کردن برنامه شما استفاده میکنند.
جایگزین استفاده از طرحوارههای URI سفارشی در برنامههای Chrome
از Chrome Identity API استفاده کنید که پاسخ OAuth 2.0 را مستقیماً به برنامهتان ارسال میکند و نیاز به URI تغییرمسیر را ازبین میبرد.
نشانی IP مسیریابی بازگشتی (macOS، Linux، رایانه Windows)
برای دریافت کد مجوز بااستفاده از این نشانی وب، برنامهتان باید در سرور وب محلی درحال گوش دادن باشد. این کار در بسیاری از پلاتفرمها امکانپذیر است، اما نه در همه آنها. بااینحال، اگر پلاتفرم شما از آن پشتیبانی میکند، این سازوکار توصیهشده برای دریافت کد مجوز است.
وقتی برنامهتان پاسخ مجوز را دریافت میکند، برای بهترین قابلیت استفاده، باید با نمایش صفحه HTML که به کاربر دستور میدهد مرورگر را ببندد و به برنامهتان برگردد پاسخ دهد.
| استفاده توصیهشده | برنامههای رایانهای macOS، Linux، و Windows |
| مقادیر فرم | نوع برنامه را روی برنامه رایانهای تنظیم کنید. |
کپی/جایگذاری دستی (منسوخشده)
از برنامههایتان محافظت کنید
بهتأیید رساندن مالکیت برنامه برای Chrome
میتوانید مالکیت برنامهتان را بهتأیید برسانید تا خطر جعل هویت برنامه کاهش یابد.
برای تکمیل فرایند درستیسنجی، باید از حساب «توسعهدهنده نتبازار Chrome» خود استفاده کنید. برای درستیسنجی موفقیتآمیز، باید شرایط زیر برآورده شود:
- باید موردی ثبتشده در داشبورد توسعهدهندگان «نتبازار Chrome» با همان شناسه موردی داشته باشید که برای کارخواه OAuth «افزونه Chrome» آن درستیسنجی را تکمیل میکنید.
- باید ناشر مورد «نتبازار Chrome» باشید. درباره مدیریت دسترسی در «داشبورد توسعهدهندگان نتبازار Chrome» بیشتر بدانید.
در بخش درستیسنجی مالکیت برنامه در کارخواه «افزونه Chrome»، روی دکمه درستیسنجی مالکیت کلیک کنید تا فرایند درستیسنجی تکمیل شود.
توجه: پساز اعطای دسترسی به حسابتان، چند دقیقه صبر کنید و سپس فرایند درستیسنجی را تکمیل کنید.
اگر درستیسنجی موفقیتآمیز باشد، اعلانی برای تأیید موفقیتآمیز بودن فرایند درستیسنجی نمایش داده میشود. درغیراینصورت، پیامواره خطا نشان داده خواهد شد.
برای رفع مشکل درستیسنجی ناموفق، موارد زیر را امتحان کنید:
- مطمئن شوید موردی ثبتشده در «داشبورد توسعهدهندگان نتبازار Chrome» وجود دارد که شناسه موردی یکسان با کارخواه OAuth افزونه Chrome دارد که درحال تکمیل درستیسنجی برای آن هستید.
- مطمئن شوید که ناشر برنامه هستید، یعنی باید ناشر فردی برنامه یا عضو ناشر گروهی برنامه باشید. بیشتر بدانید درباره مدیریت دسترسی در «داشبورد توسعهدهندگان نتبازار Chrome».
- اگر بهتازگی فهرست ناشر گروه را بهروز کردهاید، بررسی کنید که فهرست عضویت ناشر گروه در «داشبورد توسعهدهندگان نتبازار Chrome» همگامسازی شده باشد. درباره همگامسازی فهرست عضویت ناشر بیشتر بدانید.
دسترسی زمانمحور
دسترسی زمانمحور به کاربر اجازه میدهد برای مدت محدودی به برنامه شما اجازه دسترسی به دادههایش را بدهد تا کنشی را تکمیل کند. دسترسی زمانمحور در محصولات منتخب Google درطول جریان رضایت دردسترس است و به کاربران این امکان را میدهد که دسترسی را برای مدت محدودی اعطا کنند. یک نمونه از این ابزارها Data Portability API است که امکان انتقال یکباره دادهها را فراهم میکند.
وقتی کاربری به برنامه شما دسترسی زماندار اعطا میکند، ژتون بازآوری پساز مدت مشخصشده منقضی میشود. توجه داشته باشید که ژتونهای بازآوری ممکن است در شرایط خاصی زودتر باطل شوند؛ برای جزئیات بیشتر، این موارد را ببینید. فیلد refresh_token_expires_in که در پاسخ
تبادل کد
مجوز برگردانده میشود، نشاندهنده زمان باقیمانده تا انقضای ژتون بازآوری در چنین مواردی است.
مطالعه بیشتر
«روال مطلوب فعلی» IETF با عنوان OAuth 2.0 برای برنامههای بومی بسیاری از روالهای مطلوب مستندشده در اینجا را ایجاد میکند.
پیادهسازی «محافظت بینحسابی»
اقدام دیگری که باید برای محافظت از حسابهای کاربرانتان انجام دهید، پیادهسازی «محافظت بینحسابی» بااستفاده از «سرویس محافظت بینحسابی» 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
برای کسب اطلاعات بیشتر درباره نحوه پیادهسازی «محافظت بینحسابی» و فهرست کامل رویدادهای دردسترس، به صفحه «محافظت از حسابهای کاربری با محافظت بینحسابی» مراجعه کنید.