Весенняя загрузка с nginx wss не работает с angular

Моя конечная точка весенней загрузки websocket (ws) отлично работает на локальном хосте с angular (rxstomp).

Сервер prod использует nginx (https), и я не могу подключиться к ws. FE и BE находятся на одном сервере в докере по разным URL-адресам.

Конфигурация Nginx:

location /ws {

 ...

 proxy_pass http://backend/ws

 ...

}
BE: 

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setAllowedOrigins(frontendUrl);
    }

FE: 

export function rxStompServiceFactory() {
    const rxStomp = new RxStompService();
    rxStomp.configure(myRxStompConfig);
    rxStomp.activate();
    return rxStomp;
}
export const myRxStompConfig: RxStompConfig = {
    brokerURL: 'ws://localhost:8088/ws',
...

Пожалуйста помоги

Спасибо

как восходящий поток определяется в nginx? И какую ошибку вы получаете? Что-нибудь в журнале nginx?

grekier 17.10.2022 13:39

восходящий апитест { ip_hash; сервер 127.0.0.1:8085 max_fails=1 fail_timeout=6с; сервер 127.0.0.1:8086 max_fails=1 fail_timeout=6с; поддержка активности 16; }

Danni 17.10.2022 15:43

ЖУРНАЛ: 17.10.2022 14:30:31 [крит] 223719#223719: * 2929 SSL_do_handshake() не удалось (SSL: ошибка: 14201044: подпрограммы SSL: tls_choose_sigalg: внутренняя ошибка) при квитировании SSL, клиент: [IP], сервер: 0.0.0.0:443

Danni 17.10.2022 15:46

Если я правильно понимаю, у вас есть 2 сервера за балансировкой нагрузки, определенной в apitest upstream. Однако прокси-прокси настроен на серверную часть, поэтому здесь есть несоответствие...

grekier 18.10.2022 16:22

Спасибо, но это была старая конфигурация, которую я получил от системного инженера. Выложил наше решение.

Danni 09.11.2022 01:06
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
5
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, это наше решение, и, конечно, оно лучше, но оно работает.

Эта проблема:

BE (бэкенд) и FE (интерфейс) на одном сервере с разными URL-адресами. (fe.app.com и be.app.com) Также есть прокси-сервер nginx.

FE не может подключиться к BE через веб-сокет.

Итак, последовательность действий: интерфейс --> nginx(be.app.com) --> серверная часть

Основная проблема заключалась в авторизации (токен носителя), когда мы хотим подключиться с помощью wss к весеннему загрузочному приложению, потому что не можем отправить собственный заголовок в запросе подключения wss.

Решение:

Сохраните токен в файлах cookie и используйте его в бэкэнде TokenAuthorizationFilter.

(Here the token cookie name is Authorization)
  if (request.getCookies() != null) {
    for (Cookie c : request.getCookies()) {
      if (Objects.equals(c.getName(), "Authorization")) {
        if (!c.getValue().startsWith("Bearer"))
          authorizationHeader = "Bearer " + c.getValue();
      }
    }
  }

И используйте это вместо параметра авторизации в requestHeader.

This is the request header
String authorizationHeader = request.getHeader("Authorization");

Итак, теперь мы можем отправлять токен в куках, а серверная часть выполняет авторизацию.

Красиво, но есть другая проблема. Важно знать, как работают файлы cookie! (Поделиться cookie между субдоменом и доменом)

Конфигурация nginx также должна пересылать файлы cookie. В этом случае мы вызвали домен FE из FE (fe.app.com/wss) и в конфигурации nginx установили proxy_pass на местоположение веб-сокета BE (backendIp:port/ws)

Таким образом, BE получает файлы cookie и использует их для авторизации.

Я надеюсь, что это помогает. :)

Другие вопросы по теме