عميل OAuth لـ JavaScript (Node.js): دليل كامل
\n\nOAuth (Open Authorization) هو بروتوكول مفتوح يسمح بتوفير وصول محدود لتطبيق طرف ثالث إلى موارد المستخدم دون نقل اسم المستخدم وكلمة المرور الخاصة به. في عالم Node.js، يعد تنفيذ عميل OAuth من أكثر المهام شيوعًا عند إنشاء تطبيقات الويب الحديثة. في هذه المقالة، سنشرح بالتفصيل كيفية كتابة عميل OAuth خاص بك للتفويض عبر Google وGitHub باستخدام المكتبة الشهيرة Passport.js.
\n\nما هو OAuth 2.0 ولماذا هو مطلوب؟
\nOAuth 2.0 هو معيار يُستخدم لتفويض الوصول. بدلاً من تخزين كلمات مرور المستخدمين على خادمك، تقوم بتوجيههم إلى صفحة المزود (Google، GitHub، Facebook) حيث يمنحون الموافقة. بعد ذلك، يتلقى تطبيقك access token (رمز وصول)، يمكنه من خلاله الوصول إلى API الخاص بالمزود نيابة عن المستخدم.
\n\nالمزايا الرئيسية:
\n- \n
- الأمان — لا يتم تخزين كلمات المرور على خادمك. \n
- الراحة للمستخدم — لا حاجة للتسجيل مرة أخرى. \n
- المرونة — يمكن طلب البيانات الضرورية فقط (النطاق). \n
تثبيت الحزم اللازمة
\nللعمل مع OAuth في Node.js، سنستخدم المكتبات التالية:
\n- \n
express— إطار عمل ويب \n passport— middleware للمصادقة \n passport-google-oauth20— استراتيجية لـ Google \n passport-github2— استراتيجية لـ GitHub \n express-session— لتخزين الجلسات \n
قم بتثبيتها بأمر واحد:
\nnpm install express passport passport-google-oauth20 passport-github2 express-session\n\nالإعداد الأساسي للخادم
\nلننشئ ملف app.js ونقوم بتضمين جميع الوحدات اللازمة:
const express = require('express');\nconst passport = require('passport');\nconst session = require('express-session');\nconst app = express();\n\n// إعداد الجلسات\napp.use(session({\n secret: 'your-secret-key',\n resave: false,\n saveUninitialized: true\n}));\n\napp.use(passport.initialize());\napp.use(passport.session());\n\n// دالة وهمية لتسلسل المستخدم\npassport.serializeUser((user, done) => done(null, user));\npassport.deserializeUser((obj, done) => done(null, obj));\n\napp.listen(3000, () => console.log('الخادم يعمل على المنفذ 3000'));\n\nإعداد استراتيجية OAuth لـ Google
\nقبل البدء، تحتاج إلى تسجيل التطبيق في Google Cloud Console والحصول على Client ID و Client Secret. حدد في الإعدادات redirect URI: http://localhost:3000/auth/google/callback.
const GoogleStrategy = require('passport-google-oauth20').Strategy;\n\npassport.use(new GoogleStrategy({\n clientID: 'GOOGLE_CLIENT_ID_الخاص_بك',\n clientSecret: 'GOOGLE_CLIENT_SECRET_الخاص_بك',\n callbackURL: 'http://localhost:3000/auth/google/callback'\n}, (accessToken, refreshToken, profile, done) => {\n // هنا يمكنك حفظ الملف الشخصي في قاعدة البيانات\n return done(null, profile);\n}));\n\n// مسارات Google OAuth\napp.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email'] }));\n\napp.get('/auth/google/callback', \n passport.authenticate('google', { failureRedirect: '/' }),\n (req, res) => res.redirect('/profile')\n);\n\nإعداد استراتيجية OAuth لـ GitHub
\nبالنسبة لـ GitHub، قم بتسجيل تطبيق OAuth في GitHub Developer Settings. Homepage URL: http://localhost:3000، Authorization callback UR