مشكلة passport.authenticate في OAuth باستخدام JavaScript
المصادقة باستخدام بروتوكول OAuth تعتبر جزءاً أساسياً من تطوير التطبيقات الحديثة، وتعتبر مكتبة Passport.js واحدة من الأدوات الشائعة لتحقيق ذلك. في هذا المقال، سنستعرض كيفية التعامل مع مشكلة "passport.authenticate is not working" ضمن سياق استخدام OAuth مع لينكد إن، بالإضافة إلى تقديم نصائح واستراتيجيات لحل هذه المشكلة.
ما هي المشكلة؟
عند استخدام مكتبة Passport.js لمصادقة المستخدمين عبر عنوان LinkedIn، قد تواجه العديد من المشكلات التي تعوق إتمام عملية المصادقة بشكل صحيح. إحدى هذه المشكلات هي الرسالة التي تشير إلى أن التطبيق معطل. وهذه المشكلة قد تكون محبطة، خاصةً إذا قمت بفحص الكود وتأكدت من عدم وجود أخطاء واضحة.
تحليل الكود
لننظر في الكود المقدم لتسجيل الدخول عبر لينكد إن. في هذا الجزء تم تنفيذ مسار المصادقة على النحو التالي:
app.get('/api/auth/linkedin', async (req, res, next) => {
console.log('هذا هو المكان الذي ستكون فيه المصادقة');
return passport.authenticate('linkedin', {
scope: ['r_emailaddress', 'r_liteprofile'],
state: JSON.stringify(req.query),
})(req, res, next);
});
عند زيارة هذا المسار، من المفترض أن يتم استدعاء دالة passport.authenticate
، ولكن إذا لم تتمكن من رؤية أي شيء آخر سوى الرسالة في وحدة التحكم "هذا هو المكان الذي ستكون فيه المصادقة"، فربما تكون هناك مشكلة في إعدادات التطبيق أو في كيفية استدعاء استراتيجية Passport.js الخاصة بلينكد إن.
تأكد من إعدادات الاستراتيجية
الخطوة التالية هي التأكد من أن إعدادات استراتيجية جواز السفر جيدة. إليك كيفية إعدادها:
passport.use(new LinkedInStrategy.Strategy({
clientID: process.env.LINKED_IN_CLIENT_ID,
clientSecret: process.env.LINKED_IN_CLIENT_SECRET,
callbackURL: process.env.LINKED_IN_CALL_BACK_URL,
scope: ['r_emailaddress', 'r_liteprofile'],
}, async (accessToken, refreshToken, profile, done) => {
console.log('تم إطلاق وظيفة رد اتصال جواز سفر Linkedin');
const email = profile.emails[0]?.value;
const displayName = profile.displayName;
const familyName = profile.name?.familyName;
const givenName = profile.name?.givenName;
const fullName = displayName || `${givenName} ${familyName}`;
const photo_url = profile.photos?.[0]?.value || '';
const user = await userService.confirmSocialMediaAccount({
email,
photo_url,
source: 'linkedin',
fullName,
modificationNotes: [{
modifiedOn: new Date(Date.now()),
modifiedBy: null,
modificationNote: 'New user created',
}],
});
done(null, user);
}));
هنا، يجب أن تتأكد من أن جميع المتغيرات موجودة وأنها تحتوي على القيم الصحيحة. تحقق من ملف .env
الخاص بك للتأكد من أن جميع معلومات الاتصال صحيحة.
التعامل مع رد الاتصال
آخر خطوة تتعلق بالمسار الذي يتعامل مع رد الاتصال من لينكد إن:
app.get('/api/auth/linkedin/callback', (req, res, next) => {
console.log('Handling LinkedIn callback');
passport.authenticate('linkedin', { failureRedirect: '/login' }, (err, user) => {
if (err) {
console.error('خطأ في المصادقة:', err);
return next(err);
}
req.logIn(user, (error) => {
if (error) {
return next(error);
}
res.redirect('/'); // أو أي مسار آخر حسب الحاجة
});
})(req, res, next);
});
تأكد من معالجة الأخطاء بشكل صحيح. إذا وجدت خطأً، سيساعدك على فهم ما يحدث بشكل أوضح.
استنتاجات ونصائح
إذا كنت تواجه مشكلة في "javascript – passport.authenticate is not working – LinkedIn OAuth"، فهناك خطوات معينة يمكنك اتباعها لحل المشكلة:
- مراجعة إعدادات البيئة: تأكد من أن كافة معلومات الاتصال صحيحة.
- تحقق من السجل: استخدم
console.log
لتسجيل الأحداث الحيوية ومراقبة تدفق التطبيق. - اختبار المسارات: تأكد من أن المسارات تتوافق مع ما هو متوقع في إعدادات ارتباط لينكد إن.
باتباعخطوات بسيطة وسليمة، يمكنك استكشاف الأخطاء وإصلاحها بسهولة والوصول إلى تطبيق يعمل بسلاسة مع خدمة لينكد إن عبر Passport.js.