مقدمة سريعة: ايش سالفة OAuth 2.0؟
يا هلا والله بالجميع! تخيل معي، كل ما تدخل تطبيق جديد أو موقع، يطلب منك تسجل دخول. طيب، هل يعقل كل مرة تسجل بنفس بياناتك (يوزر وباسورد)؟ لا طبعاً! هنا يجي دور OAuth 2.0. ببساطة، هو طريقة آمنة تخلي تطبيق (تطبيقك مثلاً) ياخذ صلاحية الوصول لبيانات المستخدم من خدمة ثانية (زي جوجل، فيسبوك، تويتر) بدون ما يحتاج يشوف اليوزر والباسورد حقت المستخدم.
ملاحظة سريعة: OAuth 2.0 مو بروتوكول مصادقة (Authentication) بحد ذاته، هو بروتوكول تفويض (Authorization). يعني ما يقول "مين أنت؟"، بل يقول "ايش الصلاحيات اللي عندك؟" لكن غالبًا يستخدم مع بروتوكولات مصادقة زي OpenID Connect عشان يكمل الصورة.
كيف يشتغل زر "تسجيل الدخول عبر جوجل"؟ (السيناريو الأشهر)
هذا الزر اللي نشوفه بكل مكان، واللي يريحنا من عناء التسجيل كل مرة. خلينا نشوف كيف تتم العملية خطوة بخطوة:
1. المستخدم يضغط الزر (يا الله، نبدأ!)
المستخدم يفتح تطبيقك أو موقعك، ويشوف زر "تسجيل الدخول عبر جوجل". يضغط عليه، وهنا تبدأ الحفلة.
2. تطبيقك يطلب التفويض من جوجل
تطبيقك (اللي نسميه هنا Client) يرسل طلب لجوجل (اللي نسميه Authorization Server). الطلب هذا بيكون فيه شوية معلومات مهمة:
client_id: معرف فريد لتطبيقك عند جوجل.redirect_uri: الرابط اللي بترجع له جوجل بعد ما المستخدم يوافق أو يرفض. لازم يكون مسجل مسبقاً عند جوجل.scope: ايش الصلاحيات اللي تبيها من المستخدم؟ مثلاً:profile(اسمه وصورته)،email(بريده الإلكتروني)، أو الوصول لـGoogle Driveحقه.response_type: في حالتنا هذه، غالبًا تكونcode(عشان نطلبauthorization code).state: قيمة عشوائية تولدها أنت لتطبيقك عشان تتأكد إن الطلب اللي يرجع لك هو نفسه اللي أرسلته (لمنع هجمات CSRF).
عملياً، تطبيقك بيوجه متصفح المستخدم لرابط زي كذا (مثال مبسط جداً):
GET https://accounts.google.com/o/oauth2/v2/auth?
client_id=YOUR_CLIENT_ID&
redirect_uri=YOUR_REDIRECT_URI&
response_type=code&
scope=email%20profile&
state=RANDOM_STATE_STRING
3. المستخدم يوافق أو يرفض على جوجل
جوجل تفتح صفحة للمستخدم تسأله: "تطبيق (اسم تطبيقك) يبي يوصل لـ (اسمك، بريدك، إلخ)، توافق ولا لأ؟" المستخدم (اللي نسميه Resource Owner) يختار "موافق" أو "رفض".
4. جوجل ترجع المستخدم لتطبيقك (مع كود!)
إذا وافق المستخدم، جوجل ترجع المتصفح لـ redirect_uri اللي أنت حددته، بس هالمرة معاه authorization code (كود تفويض) وقيمة state اللي أرسلتها. شكل الرابط بيكون كذا:
GET YOUR_REDIRECT_URI?code=SOME_LONG_AUTHORIZATION_CODE&state=RANDOM_STATE_STRING
نقطة مهمة: الـ
authorization codeهذا قصير الأجل، يعني ما يبقى شغال إلا لدقائق معدودة، ويستخدم مرة وحدة بس.
5. تطبيقك يبادل الكود بـ Access Token (هنا الشغل الثقيل)
هذي الخطوة تصير بين سيرفر تطبيقك وسيرفر جوجل مباشرة (Backend-to-Backend)، يعني المتصفح ما له دخل فيها عشان الأمان. تطبيقك يرسل طلب لسيرفر جوجل فيه الـ authorization code اللي استلمه، و client_id، و client_secret (سر خاص بتطبيقك ما يعرفه إلا سيرفرك وسيرفر جوجل)، و redirect_uri. جوجل تتأكد من كل المعلومات، وإذا كل شي تمام، ترجع لتطبيقك Access Token.
مثال على الطلب (POST):
POST https://oauth2.googleapis.com/token
Content-Type: application/x-www-form-urlencoded
client_id=YOUR_CLIENT_ID&
client_secret=YOUR_CLIENT_SECRET&
code=SOME_LONG_AUTHORIZATION_CODE&
redirect_uri=YOUR_REDIRECT_URI&
grant_type=authorization_code
الرد من جوجل بيكون شي زي كذا:
{
"access_token": "ya29.a0ARke...",
"expires_in": 3599, // صلاحية التوكن بالثواني (ساعة تقريباً)
"scope": "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile",
"token_type": "Bearer",
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6..." // هذا يستخدم مع OpenID Connect
}
6. تطبيقك يستخدم Access Token للوصول لبيانات المستخدم
الآن، تطبيقك صار عنده Access Token. هذا التوكن مثل "مفتاح" مؤقت يعطيه صلاحية الوصول للبيانات اللي وافق عليها المستخدم. تطبيقك يقدر يستخدم هذا التوكن عشان يكلم Resource Server حق جوجل (مثلاً، API حق بيانات المستخدم) ويطلب معلومات زي اسم المستخدم، بريده الإلكتروني، صورته، إلخ.
مثال على طلب بيانات المستخدم:
GET https://www.googleapis.com/oauth2/v2/userinfo
Authorization: Bearer ya29.a0ARke...
الرد بيكون معلومات المستخدم:
{
"id": "1234567890",
"email": "user@example.com",
"verified_email": true,
"name": "اسم المستخدم",
"given_name": "اسم",
"family_name": "المستخدم",
"picture": "https://lh3.googleusercontent.com/a/...",
"locale": "ar"
}
ايش يعني Access Token؟
الـ Access Token هو مفتاح مؤقت (عادةً صلاحيته ساعة) يعطي تطبيقك صلاحية الوصول لبيانات محددة للمستخدم. هو ما يكشف هوية المستخدم مباشرة لتطبيقك، بل هو مجرد إذن. إذا انتهت صلاحيته، لازم تطبيقك يطلب واحد جديد.
طيب، والـ Refresh Token؟
أحياناً، تطبيقك يحتاج صلاحية وصول لفترة أطول (مثلاً، عشان يسوي مزامنة خلفية). هنا يجي دور الـ Refresh Token. هذا التوكن يكون طويل الأجل (أيام، أسابيع، شهور أو حتى دائم حتى يتم إلغاؤه). تطبيقك يقدر يستخدمه عشان يطلب Access Token جديد بدون ما يضطر المستخدم يرجع يسجل دخول مرة ثانية. طبعاً، هذا التوكن لازم يكون آمن جداً ومحفوظ بسيرفر تطبيقك.
خلاصة الكلام
OAuth 2.0 (ومعه OpenID Connect اللي يستخدم لتحديد الهوية) هو الأساس اللي يخلي "تسجيل الدخول عبر جوجل" آمن وسهل. بدل ما تطبيقك يشوف كلمة مرورك، هو ياخذ "إذن" من جوجل عشان يوصل لبياناتك اللي أنت تسمح له فيها. كذا، بياناتك البنكية والأشياء الحساسة تبقى آمنة عند جوجل، وتطبيقك ياخذ بس اللي يحتاجه عشان يشتغل.
أتمنى يكون الشرح واضح ومفيد! نشوفكم في دروس قادمة.