في أنظمة OAuth 2.0 و OpenID Connect قد يحصل التطبيق على أكثر من Token، وتشابه شكلها—خصوصًا عندما تكون JWT— يجعل بعض المطورين يعاملونها كأنها الشيء نفسه. لكنها تخدم أغراضًا مختلفة. ID Token يخبر Client عن حدث المصادقة وهوية المستخدم ضمن OpenID Connect، بينما Access Token هو credential مخصص للوصول إلى Resource Server/API ضمن Scope محدد. الخلط بينهما يضع الثقة في مكان غير صحيح.
ID Token موجهة لل Client
ID Token تحتوي Claims مثل issuer و subject و audience وربما auth_time وغيرها. ال ـClient يتحقق منها ليعرف أن مزود الهوية صادق على المستخدم. Audience يجب أن تتضمن ال ـClient المقصود. لا ينبغي إرسال ID Token عشوائيًا إلى APIs باعتبارها تصريح وصول.
Access Token موجهة لل Resource Server
API تستقبل Access Token وتتحقق من صلاحيتها و scope/audience حسب تصميم المزود. ال ـClient لا يجب أن يفترض شكلها الداخلي؛ قد تكون JWT أو opaque token. ما يهم هو أنها تصريح للوصول إلى مورد، لا بطاقة هوية للمستخدم.
خطوات عملية
- حدد من أصدر Token.
- حدد الجمهور المقصود.
- حدد Resource/Scope.
- تحقق من signature/introspection حسب النظام.
- ارفض Token لم تُصدر لل ـAPI المقصودة.
لا تستخدم Claims بلا تحقق
فك JWT Base64 لا يعني التحقق منها. يجب التحقق من signature و issuer و audience و exp وغيرها وفق المكتبة والبروتوكول. كذلك لا تثق في email كمعرف ثابت إذا كان provider يحدد subject مختلفًا.
قائمة مراجعة
- Signature verified.
- Issuer مطابق.
- Audience صحيحة.
- Expiry لم تنتهِ.
- Scope مناسب لل API.
- Subject يستخدم كمعرف وفق تصميم المزود.
ماذا عن Refresh Token؟
Refresh Token تستخدم للحصول على Access Tokens جديدة وغالبًا أطول حساسية من Access Token نفسها. لا ترسلها إلى Resource APIs، وخزنها بطريقة آمنة وطبق rotation/revocation عندما يدعم المزود ذلك.
صمم الحدود بين Frontend و Backend
في تطبيقات الويب، تجنب توزيع Tokens أكثر مما يلزم. Backend يمكن أن يحتفظ ببعض الاعتمادات ويمنح Browser Session مناسبة بدل كشف Refresh Token للواجهة. القرار يعتمد على architecture، لكن المبدأ هو أقل exposure ممكن.
اختبر Audience الخاطئة عمدًا
ضمن اختبارات الأمان، أرسل Access Token مخصصة لخدمة A إلى خدمة B وتأكد أنها تُرفض، وافعل الشيء نفسه مع ID Token في endpoint يتوقع Access Token. هذه الاختبارات السلبية تكشف APIs تقبل أي JWT موقعة من نفس issuer بلا تحقق كافٍ من aud أو scope. التحقق الصحيح يجب أن يثبت أن Token صالحة لهذا المورد تحديدًا، لا أنها تبدو أصلية فقط.
ID Token مقابل Access Token
| الغرض | إثبات حدث المصادقة وهوية المستخدم لل ـClient | تفويض الوصول إلى API أو مورد محمي |
| الجهة المستفيدة | تطبيق العميل / Relying Party | Resource Server أو ال ـAPI المقصود |
| الاستخدام المعتاد | بناء سياق تسجيل الدخول وقراءة claims الهوية | إرساله مع طلبات الوصول المصرح بها |
| خطأ يجب تجنبه | استخدامه كتذكرة عامة لاستدعاء APIs | قبوله خارج الجمهور أو النطاق الذي صدر له |
شارك في تقييم ونقاش المقال
رأيك يضيف قيمة للمقال ويساعدنا على تحسين المحتوى والنقاش حوله.
النقاش
جارٍ تحميل التعليقات…