Я пытаюсь настроить мой кабель действия в рельсах с угловым 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
Вопросы
Это нормально, что действие подписки отинтерфейс заканчивает тем, что пингует сервер одним и тем же запросом каждые несколько секунд (Запущено GET "/cable?access-token=TJxxxxxxxxxxxxxxxxxxxsg&client=rkxxxxxxxxxxxxxxxxxxa5g&uid=my_email@gmail.com")? Я подумал, что это будет просто для аутентификации в первый раз, а затем бэкэнд будет проталкивать информацию через веб-сокет.
Ясно, что «попытка несанкционированного подключения была отклонена» происходит, так кактокен в конечном итоге устаревает с повторным пингом одного и того же запроса от подписчика. Если это ожидаемый результат, я должен обновлять токен с каждым пингом? Это, кажется, частично победить цель использования потокового сервиса? Пожалуйста, уточните мое понимание