ActionCable - не удалось перейти на WebSocket

У меня проблема с подключением к веб-сокету. Произошла ошибка:

Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ?  [["LIMIT", 1]]
An unauthorized connection attempt was rejected
Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
Finished "/cable/" [WebSocket] for 127.0.0.1 at 2016-09-11 18:57:49 +0200
Finished "/cable/" [WebSocket] for 127.0.0.1 at 2016-09-11 18:57:49 +0200

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', "User #{current_user.id}"
    end

    protected

    def find_verified_user
      if verified_user = User.find_by(id: cookies.signed[:user_id])
        verified_user
      else
        reject_unauthorized_connection
      end
    end
  end
end

Я нашел решение, которое следует использовать config.allowed_request_origins, но оно не решает мою проблему. Я пробовал использовать session_helper, добавив этот метод:

def set_cookie(user)
  the_username = user.username.to_s
  cookies.permanent.signed[:username] = the_username
end

Ничто не решает мою проблему.

Обновление: я видел, что проблема в том, что cookies.signed [: user_id] равно нулю. Есть ли у вас предложения, в чем может быть причина этого? Я использую стандартные URL и порт для тестов (localhost: 3000).


person Prezes Łukasz    schedule 11.09.2016    source источник
comment
Увидев те же ошибки в моих журналах по той же проблеме, это сообщение SO помогло мне решить мою проблему. stackoverflow.com/questions/38719359/. Просто нужно установить config.action_cable.allowed_request_origins в config/environments/development.rb с хостами, которым вы разрешите подключаться к вашему приложению через веб-сокеты.   -  person ethaning    schedule 17.03.2021


Ответы (2)


Я решил свою проблему, используя env['warden'].user. Ниже представлен обновленный метод.

   def find_verified_user
      (current_user = env['warden'].user) ? current_user : reject_unauthorized_connection
   end
person Prezes Łukasz    schedule 12.09.2016
comment
Этого недостаточно. Таким образом, вы просто удалили ошибку, когда пользователь вошел в систему. Но если пользователь не вошел в систему, ошибка сохраняется. Это из-за App.room = App.cable.subscriptions.create "RoomChannel" вызова inside room.coffee (или подобного в вашем коде). Решением будет условный рендеринг room.coffee в зависимости от того, вошел ли пользователь в систему или нет - но для этого потребуется исключить room.coffee из ресурсов - и его отдельный рендеринг (потому что вы не можете условно рендерить js, если пользователь вошел в систему / вышел из системы) . - person prograils; 04.04.2017

Прежде чем вносить какие-либо изменения в свой код, просто остановите сервер rails и выполните установку пакета, а затем перезапустите. Может быть, эта проблема будет решена.

person pavan kalyan    schedule 07.04.2020