Nest backend выпускает jwt token, который затем используется в fetch запросах на стороне nextjs сервера (не клиента) в bearer header. Причина по которой мне нужна аутентификация от nest а не от nextjs (nextauth) заключается в том, что мне нужен socket io сервер, причем с авторизацией. К сожалению, чтобы установить подключение к socket io серверу, мне нужно получить токен на клиенте. Лучшая практика хранения токена в браузере предполагает хранить http only secure cookie, доступ к которой на клиенте невозможно получить. Тогда у меня вопрос: а как построить систему так, чтобы получить желаемый результат?
Мои попытки полазить в open source nextauth привели к следующему:
nextauth предоставляет useSession хук на клиенте, который использует React.Context, который в свою очередь получает данные о сессии через fetch запрос на api point nextjs сервера. Я не уверен, хорошая ли это идея, например, сделать свой api point на nest который будет предоставлять jwt?
Так же я нашел такой способ:
прочитать куку на сервере nextjs, и пробросить ее через пропсы в клиентский компонент. Я тоже не уверен в этом способе, ведь получается теперь токен может прочитать внешний скрипт и тогда нет толку хранить токен в http only cookie?
Может быть вы знаете другие способы решения такой проблемы в проде?
Константин Б., вы имеете в виду делать fetch запрос на бэк сервер и получить ответ в виде токена на клиенте, который затем использовать для авторизации сокета?
Мне кажется что это не совсем безопасно, правда обьяснить свое опасение не могу, поэтому спрашиваю совета
Во первых, использовать jwt для сессии не лучшая идея, подробнее тут.
Касательно самого вопроса. Токен на клиенте получать необязательно, браузер будет отправлять http only cookie во время web socket handshake, только их нужно правильно настроить.
Можно придумать и другие способы аутентификации для websocket. Вот неплохая статья
Также socket io позволяет использовать олдскульный long polling, тут вообще с отправкой http only cookie никаких проблем т.к в данном случае с фронта будет отправляться обычный GET запрос.
Если domain сервера который устанавливает куки и domain socket io сервера отличается, то понадобится установка параметра Samesite=None, но тут нужно учитывать CSRF.
Еще при установке cookie можно установить атрибут Domain через wildcard, чтобы сделать cookie доступными для под доменов(например, http server example.org и socket io server ws.example.org)
CapToYou, спасибо оргомное, я тоже думал насчет web socket handshake варианта. И огромное спасибо за статьи. Можно попросить вас отправить хорошие статьи с примерами про csrf токен на nestjs? или может какой нибудь опен сорс проект на несте который это реализует?