Zen Eddin Allaham نشر 21 يونيو أرسل تقرير نشر 21 يونيو مرحبًا، أواجه مشكلة في مشروع Full Stack (NestJS + Next.js + Socket.io) وأحتاج مساعدة في debugging لأن المشكلة غير واضحة رغم أن نظام التوثيق يبدو صحيحًا. المشكلة: Socket.io لا يتصل أو يتم رفض الاتصال برسالة: Socket connection blocked: no authenticated user رغم أن: المستخدم مسجل دخول بشكل صحيح التوكن موجود وصحيح التوكن مخزن في HttpOnly cookie التحقق في REST API يعمل بدون مشاكل لكن Socket connection يفشل. ملاحظات مهمة: التوكن يتم توليده عبر TokenService يتم تخزينه في HttpOnly cookie الـ backend يستخدم AuthGuard للـ HTTP requests والـ Socket يستخدم AuthSocketAdapter للتحقق من التوكن الملفات التي يجب مراجعتها لفهم المشكلة: Frontend: useNotification.ts useNotificationStore.ts useAuthStore.ts socket.ts Backend: main.ts notification.gateway.ts socket.adapter.ts auth.guard.ts app.module.ts token.service.ts ملاحظة تقنية مهمة: أنا أستخدم: HTTP auth عبر HttpOnly cookies Socket auth عبر socket.handshake.auth.token أو headers لكن يبدو أن هناك عدم تطابق بين طريقة التوثيق في HTTP و Socket مما يؤدي لفشل الاتصال رغم أن التوكن موجود وصحيح. المطلوب: أريد تحديد السبب الحقيقي لعدم اتصال Socket.io رغم أن: المستخدم authenticated في HTTP التوكن صحيح وغير منتهي السيرفر يعمل بشكل طبيعي وأيضًا أريد أفضل practice لتوحيد authentication بين: REST API Socket.IO Zen academy.zip اقتباس
0 محمد عاطف25 نشر 21 يونيو أرسل تقرير نشر 21 يونيو الخطأ لديك في ملف backend\src\socket\socket.adapter.ts . ففي التعليقات في كود الـ Frontend في ملف frontend\app\socket\socket.ts تقول أن الباك إند يقرأ التوكن من socket.handshake.headers.cookie مباشرة ولكن إذا نظرنا إلى كود AuthSocketAdapter في الواجهة الخلفية سنجد أنه لا يقرأ الكوكيز أبدا فالكود الحالي في الباك إند يبحث عن التوكن هنا: const token = socket.handshake.auth?.token || socket.handshake.headers?.authorization?.split(' ')[1]; وبما أنك تعتمد على HttpOnly Cookie وتستخدم withCredentials: true فإن التوكن سيصل إلى الباك إند داخل socket.handshake.headers.cookie وليس في ال auth أو ال authorization. والحل أنك تحتاج إلى استخراج التوكن من ال Cookie و أسهل طريقة هي استخدام حزمة cookie الخاصة ب Node.js. قم بتعديل ملف backend\src\socket\socket.adapter.ts ليقوم بفك تشفير الكوكيز واستخراج التوكن: import { IoAdapter } from '@nestjs/platform-socket.io'; import { TokenService } from 'src/token/token.service'; import { Server, Socket } from 'socket.io'; import { INestApplication } from '@nestjs/common'; import { NextFunction } from 'express'; import { FRONTEND_URL } from 'src/url'; import * as cookie from 'cookie'; export class AuthSocketAdapter extends IoAdapter { constructor( app: INestApplication, private tokenService: TokenService, ) { super(app); } createIOServer(port: number, options?: any): Server { const server = super.createIOServer(port, { ...options, cors: { origin: FRONTEND_URL, credentials: true, }, }); server.use((socket: Socket, next: NextFunction) => { try { const rawCookies = socket.handshake.headers.cookie; if (!rawCookies) { return next(new Error('Unauthorized: No cookies found')); } const parsedCookies = cookie.parse(rawCookies); const token = parsedCookies.token; if (!token) return next(new Error('Unauthorized')); const payload = this.tokenService.verifyToken(token); socket.data.user = payload; next(); } catch { next(new Error('Unauthorized')); } }); return server; } } 1 اقتباس
0 Zen Eddin Allaham نشر 21 يونيو الكاتب أرسل تقرير نشر 21 يونيو (معدل) فعلا تم حل مشكلة شكرا لكم جدا لكن واجهتني مشكلة اخرة على الرغم من ان NestJs بدء ب عمل realtime الا ان في فرونت اند لازم احدث صفحة حتى يظهر اشعار تم التعديل في 21 يونيو بواسطة Zen Eddin Allaham اقتباس
السؤال
Zen Eddin Allaham
مرحبًا،
أواجه مشكلة في مشروع Full Stack (NestJS + Next.js + Socket.io) وأحتاج مساعدة في debugging لأن المشكلة غير واضحة رغم أن نظام التوثيق يبدو صحيحًا.
المشكلة:
Socket.io لا يتصل أو يتم رفض الاتصال برسالة:
Socket connection blocked: no authenticated userرغم أن:
المستخدم مسجل دخول بشكل صحيح
التوكن موجود وصحيح
التوكن مخزن في HttpOnly cookie
التحقق في REST API يعمل بدون مشاكل
لكن Socket connection يفشل.
ملاحظات مهمة:
التوكن يتم توليده عبر TokenService
يتم تخزينه في HttpOnly cookie
الـ backend يستخدم AuthGuard للـ HTTP requests
والـ Socket يستخدم AuthSocketAdapter للتحقق من التوكن
الملفات التي يجب مراجعتها لفهم المشكلة:
Frontend: useNotification.ts useNotificationStore.ts useAuthStore.ts socket.ts Backend: main.ts notification.gateway.ts socket.adapter.ts auth.guard.ts app.module.ts token.service.tsملاحظة تقنية مهمة:
أنا أستخدم:
HTTP auth عبر HttpOnly cookies
Socket auth عبر socket.handshake.auth.token أو headers
لكن يبدو أن هناك عدم تطابق بين طريقة التوثيق في HTTP و Socket مما يؤدي لفشل الاتصال رغم أن التوكن موجود وصحيح.
المطلوب:
أريد تحديد السبب الحقيقي لعدم اتصال Socket.io رغم أن:
المستخدم authenticated في HTTP
التوكن صحيح وغير منتهي
السيرفر يعمل بشكل طبيعي
وأيضًا أريد أفضل practice لتوحيد authentication بين:
REST API
Socket.IO
Zen academy.zip
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.