Pull to refresh

Comments 11

Хотел поинтересоваться, как Вы решили вопрос с авторизацией, а именно с передачей jwt токена на с клиента на сервер ? Установка header'a с вебсокетами не работает ...

Предположу, что отношение к веб-сокету в данном случае как к обычному сокету и весь протокол строится вручную, как в старые-добрые (для кого-то) времена.

А что именно не работает?

Вот у нас фрагмент на react:

import { useCallback, useEffect, useState } from "react";
import io, { Socket } from "socket.io-client";

...
  const [socket, setSocket] = useState<Socket | null>(null);

  const connectSocket = useCallback(() => {
    const socketTemp = io(url, {
      path,
      reconnection: true,
      extraHeaders: {
        Authorization: `Bearer ${accessToken}`,
      },
    });
    setSocket(socketTemp);
  }, [url, path, accessToken]);

  const disconnectSocket = useCallback(() => {
    socket?.disconnect();
    setSocket(null);
  }, [socket]);

И на сервере всё принимается

import {
    MessageBody,
    SubscribeMessage,
    WebSocketGateway,
    WebSocketServer,
    ConnectedSocket,
    OnGatewayConnection,
    OnGatewayDisconnect
} from '@nestjs/websockets'
import { ExtractJwt } from 'passport-jwt'

@WebSocketGateway({ cors: true, ... })
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
    
    extractUser(request: IncomingMessage): { token: string, tokenData: TokenData } {
        try {
            const extrator = ExtractJwt.fromAuthHeaderAsBearerToken();
            const token = extrator(request);
            const tokenData = this.authService.decodeUser(token);
            return { token, tokenData };
        } catch {
            return null;
        }
    }

    async handleConnection(client: SocketWithUser): Promise<string> {
        const { token, tokenData } = this.extractUser(client.request);
        ...
    }
}

Понятно. Повезло вам что используете socket.io, на голом websocket такое не сработает ;(

With extraHeaders

This only works if polling transport is enabled (which is the default). Custom headers will not be appended when using websocket as the transport. This happens because the WebSocket handshake does not honor custom headers. (For background see theWebSocket protocol RFC)

Я пока-что не придумал ничего лучше как сделать токен короткоживущим и передавать как часть URL

Для документирования websocket можно использовать пакет nestjs-asyncapi

Можно) Но тут идея про другое чуть, избавления от дублирования двух АПИ, оно одно для всех разом

UFO just landed and posted this here

так получилось, извините

Эмм, как фетч позволяет организовать двухстороннюю связь с сервером?

UFO just landed and posted this here

Ну вот когда реализация http2 будет хотябы в 90% веб серверов машин и веб-серверов фреймворков/библиотек можно будет сказать, что оно заменяет. К примеру nginx не проксирует http2 и не планирует, пара пара пам, фьюх. На сколько я помню ws воскрешают в http2 т.к. стримы его не заменили.

Sign up to leave a comment.

Articles