Как заставить рельсовый кабель работать с угловым 2/4/6/8? Я теряю аутентификацию - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь настроить мой кабель действия в рельсах с угловым 2+.

Поэтому я использовал ng2cable для подписки на серверную часть следующим образом:

Угловой компонент Код

this.ng2cable.subscribe(
  'ws://localhost:3000/cable?access-token=' +localStorage.getItem("accessToken")+ '&client=' + localStorage.getItem("client")+'&uid='+localStorage.getItem("uid"), 
  'NotificationChannel', 
  {}
);
this.broadcaster.on<string>('NotificationChannel').subscribe(
  message => {
    console.log(message);
  }
);

Файл My Rails connection.rb

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
      logger.add_tags 'ActionCable', current_user.get_email
    end
  private
      def find_verified_user
        access_token = request.query_parameters[:'access-token']
        client_id = request.query_parameters[:client]
        uid=  request.query_parameters[:uid]
        verified_user = User.find_by(email: uid)

        if verified_user && verified_user.valid_token?(access_token, client_id)
          verified_user
        else
          reject_unauthorized_connection
        end
      end
  end
end

messages_channel.rb

class NotificationChannel < ApplicationCable::Channel
  def subscribed
    stream_from "notification_channel"
  end
  def unsubscribed
  end
end

Где-то в моем контроллере приложения rails:

ActionCable.server.broadcast "notification_channel", notification: 'this is a notification'

Я вижу, что изначально подписка отлично работает со свежими токенами, поскольку пользователь действителен. Но затем я вижу, что на сервере следующий код зацикливается и пытается проверять токены, отправляемые каждые несколько секунд как часть подписки. Я думал, что аутентификация websocket была единовременной, и как только соединение было установлено, оно будет непрерывно передаваться.

Вывод

Started GET "/cable?access-token=TJxxxxxxxxxxxxxxxxxxxsg&client=rkxxxxxxxxxxxxxxxxxxa5g&uid=my_email@gmail.com" for ::1 at 2019-10-21 18:09:26 +0530
Remote IP: ::1
Started GET "/cable/?access-token=TJxxxxxxxxxxxxxxxxxxxsg&client=rkxxxxxxxxxxxxxxxxxxa5g&uid=my_email@gmail.com" [WebSocket] for ::1 at 2019-10-21 18:09:26 +0530
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
An unauthorized connection attempt was rejected
Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
Finished "/cable/?access-token=TJxxxxxxxxxxxxxxxxxxxsg-x_sg&client=rkPOGSNnVt97dUJ1hSDa5g&uid=my_email@gmail.com" [WebSocket] for ::1 at 2019-10-21 18:09:27 +0530
Finished "/cable/?access-token=TJxxxxxxxxxxxxxxxxxxxsg-x_sg&client=rkxxxxxxxxxxxxxxxxxxa5g&uid=my_email@gmail.com" [WebSocket] for ::1 at 2019-10-21 18:09:27 +0530

Вопросы

  1. Это нормально, что действие подписки отинтерфейс заканчивает тем, что пингует сервер одним и тем же запросом каждые несколько секунд (Запущено GET "/cable?access-token=TJxxxxxxxxxxxxxxxxxxxsg&client=rkxxxxxxxxxxxxxxxxxxa5g&uid=my_email@gmail.com")? Я подумал, что это будет просто для аутентификации в первый раз, а затем бэкэнд будет проталкивать информацию через веб-сокет.

  2. Ясно, что «попытка несанкционированного подключения была отклонена» происходит, так кактокен в конечном итоге устаревает с повторным пингом одного и того же запроса от подписчика. Если это ожидаемый результат, я должен обновлять токен с каждым пингом? Это, кажется, частично победить цель использования потокового сервиса? Пожалуйста, уточните мое понимание

...