اذهب إلى المحتوى

السؤال

نشر

مرحبًا،

أواجه مشكلة في مشروع 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

Recommended Posts

  • 0
نشر

الخطأ لديك في ملف 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;
  }
}

 

  • 0
نشر (معدل)

فعلا تم حل مشكلة شكرا لكم جدا لكن واجهتني مشكلة اخرة على الرغم من ان NestJs بدء ب عمل realtime الا ان في فرونت اند لازم احدث صفحة حتى يظهر اشعار 

تم التعديل في بواسطة Zen Eddin Allaham

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...