2016-09-11 14 views
6

ウェブソケットへの接続に問題があります。エラーがあります: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]がnilであるという問題がありました。何が原因なの?テスト用に標準のURLとポートを使用します(localhost:3000)。

答えて

6

env['warden'].userを使用して問題を解決しました。以下は更新されたメソッドです。

def find_verified_user 
     (current_user = env['warden'].user) ? current_user : reject_unauthorized_connection 
    end 
+3

これでは不十分です。この方法では、ユーザーがログインしているときにエラーを取り除いただけです。しかし、ユーザーがログインしていない場合、**エラーは継続します**。これは、 'App.room = App.cable.subscriptions.create" RoomChannel "' 'room.coffee'の中で(またはあなたのコードのように)呼び出すためです。解決策は、ユーザがログインしているかどうかに応じて 'room.coffee'を条件付きでレンダリングすることですが、それは' room.coffee'をアセットから除外する必要があります - そして、別々のレンダリングです(条件付きでjsをユーザーがログイン/ログアウトしています)。 – prograils

関連する問題