ActionCable - 无法升级到WebSocket

Pre*_*asz 8 ruby-on-rails websocket actioncable

我有一个连接到Web套接字的问题.有一个错误:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我找到了一些我应该使用的解决方案config.allowed_request_origins,但它并没有解决我的问题.我通过添加此方法尝试使用session_helper:

def set_cookie(user)
  the_username = user.username.to_s
  cookies.permanent.signed[:username] = the_username
end
Run Code Online (Sandbox Code Playgroud)

没有什么能解决我的问题.

更新:我看到问题是cookies.signed [:user_id]是零.你有什么建议可以解释这个问题吗?我使用标准URL和端口进行测试(localhost:3000).

Pre*_*asz 5

我通过使用解决了我的问题env['warden'].user.以下是更新方法.

   def find_verified_user
      (current_user = env['warden'].user) ? current_user : reject_unauthorized_connection
   end
Run Code Online (Sandbox Code Playgroud)

  • 这还不够.这样,您只需在用户登录时删除该错误.但如果用户未登录,则**错误仍然存​​在**.这是因为'app.room = App.cable.subscriptions.create"RoomChannel"`在room.coffee`里面调用`(或者像你代码中的那样).解决方案是有条件地渲染`room.coffee`取决于用户是否登录 - 但这需要从资产中排除`room.coffee` - 以及它的单独渲染(因为你无法有条件地渲染js,如果用户登录/注销). (4认同)