در فضای امنیتی برنامههای مدرن، درک نحوه احراز هویت کاربران و مجوزدهی به دسترسی به منابع حیاتی است. برای توسعهدهندگان، تمایز بین OAuth 2.0 و OpenID Connect (OIDC) نه تنها یک بحث آکادمیک، بلکه برای ساخت برنامههای امن و مقیاسپذیر ضروری است. اگرچه این پروتکلها اغلب به جای یکدیگر استفاده میشوند، اما اهداف متمایز اما مکملی را دنبال میکنند. این پست به بررسی ظرافتهای فنی هر دو، نحوه یکپارچهسازی آنها و بهترین شیوهها برای پیادهسازی میپردازد.
پایه: چارچوب مجوزدهی OAuth 2.0
توضیح یک سوءتفاهم رایج ضروری است: OAuth 2.0 یک چارچوب مجوزدهی است، نه یک پروتکل احراز هویت. این پروتکل با تفویض دسترسی سروکار دارد. زمانی که کاربر میخواهد به یک برنامه شخص ثالث اجازه دسترسی به منابع خود را در یک سرویس دیگر بدهد (مانند اجازه دادن به یک برنامه عکس برای دسترسی به عکسهای اینستاگرام شما)، OAuth 2.0 استانداردی است که برای صدور توکنهای دسترسی استفاده میشود.
موجودیت اصلی در OAuth 2.0 توکن دسترسی است. این توکن نمایانگر مجوزهایی است که به برنامه مشتری اعطا شده است. نکته مهم این است که توکنهای دسترسی هرگز نباید برای شناسایی هویت کاربر استفاده شوند. آنها رشتههای مبهمی هستند که صرفاً برای مجوزدهی به درخواستهای API طراحی شدهاند.
سناریویی را در نظر بگیرید که یک برنامه موبایل درخواست دسترسی به کتابخانه Spotify کاربر را دارد. سرور Spotify یک توکن دسترسی صادر میکند. برنامه موبایل این توکن را در هدر Authorization هنگام ارسال درخواستهای API ارسال میکند:
GET /v1/me/tracks HTTP/1.1
Host: api.spotify.com
Authorization: Bearer 2YotnFZFEjr1zCsicMWpAA
این امر تضمین میکند که برنامه میتواند آهنگها را بخواند، اما به خودی خود هویت کاربر را فراتر از داشتن یک توکن معتبر اثبات نمیکند.
گسترش OAuth 2.0: ورود OpenID Connect
اگر OAuth 2.0 پاسخ میدهد که «آیا میتوانم این کار را انجام دهم؟»، OpenID Connect پاسخ میدهد که «تو کیستی؟». OIDC یک لایه هویت ساده است که روی چارچوب OAuth 2.0 ساخته شده است. این پروتکل به مشتریان اجازه میدهد تا هویت کاربر نهایی را بر اساس احراز هویت انجام شده توسط سرور مجوزدهی تأیید کنند، همچنین اطلاعات پروفایل اولیه کاربر نهایی را به روشی قابل تعامل و شبیه REST به دست آورند.
افزوده کلیدی که OIDC به میز میآورد توکن ID است. این یک توکن وب JSON (JWT) است که ادعاها (claims) مربوط به رویداد احراز هویت را حاوی میشود. برخلاف توکن دسترسی مبهم، توکن ID ساختاریافته و امضا شده است که به مشتری اجازه میدهد هویت کاربر را بدون نیاز به پرسوجو با سرور بکاند، رمزگشایی و تأیید کند.
پیادهسازی عملی: جریان کد مجوزدهی
برای برنامههای وب، جریان کد مجوزدهی با PKCE (کلید اثبات برای تبادل کد) رویکرد توصیه شده است. این جریان تعادلی بین امنیت و قابلیت استفاده ایجاد میکند و حملات دستکاری را کاهش میدهد.
مراحل گام به گام
- آغاز: مشتری یک تأییدکننده کد و چالش کد تولید میکند و کاربر را به سرور مجوزدهی هدایت میکند.
- احراز هویت: کاربر وارد سیستم میشود.
- مجوزدهی: سرور با یک کد مجوزدهی به مشتری بازگشت میکند.
- تبادل توکن: مشتری کد را برای یک
access_token، یکid_tokenو در صورت وجود یکrefresh_tokenمبادله میکند.
هنگام مدیریت پاسخ از نقطه پایانی توکن، سرور باید یک پیکربندی JSON مشابه زیر بازگرداند:
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"id_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
"expires_in": 3600
}
باید id_token را با بررسی امضای آن در برابر کلید عمومی ناشر و تأیید ادعاهایی مانند iss (ناشر)، aud (مخاطب) و exp (تاریخ انقضا) اعتبارسنجی کرد.
بهترین شیوهها برای پیادهسازی امن
پیادهسازی این پروتکلها نیازمند رعایت دقیق استانداردهای امنیتی است. همیشه از HTTPS برای جلوگیری از دستکاری توکن استفاده کنید. هرگز توکنها را در فضای ذخیرهسازی محلی یا کوکیها بدون پرچمهای HttpOnly و Secure ذخیره نکنید؛ از فضای ذخیرهسازی جلسه برای توکنهای کوتاهمدت در صورت لزوم استفاده کنید. علاوه بر این، همیشه PKCE را پیادهسازی کنید، حتی برای برنامههای تکصفحهای (SPAs)، تا در برابر حملات دستکاری کد مجوزدهی دفاع کنید.
نتیجهگیری
تسلط بر OAuth 2.0 و OpenID Connect یک آیین ورود برای توسعهدهندگان ارشد بکاند و فرانتاند است. با درک اینکه OAuth 2.0 تفویض دسترسی را مدیریت میکند و OIDC هویت را مدیریت میکند، میتوانید سیستمهایی را مهندسی کنید که هم امن و هم کاربرپسند باشند. به یاد داشته باشید: از OAuth برای دسترسی و از OIDC برای هویت استفاده کنید و همیشه توکنها را به دقت اعتبارسنجی نمایید. همانطور که فضای تهدیدات تکامل مییابد، بهروز ماندن با این استانداردها تضمین میکند که برنامههای شما در برابر حملات مبتنی بر هویت مدرن مقاوم باقی بمانند.