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
так получилось, извините
Эмм, как фетч позволяет организовать двухстороннюю связь с сервером?
WebSocket ориентированое Api на Nest.js