2016-09-11 25 views
6

Tôi gặp sự cố với kết nối với ổ cắm web. Có một lỗi:ActionCable - không thể nâng cấp lên 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 

Tôi tìm thấy một số giải pháp mà tôi nên sử dụng config.allowed_request_origins, nhưng nó không giải quyết được vấn đề của tôi. Tôi đã thử với session_helper bằng cách thêm phương thức này:

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

Không có gì sửa chữa sự cố của tôi.

Cập nhật: Tôi thấy rằng vấn đề là cookie.signed [: user_id] là không. Bạn có đề nghị gì về nguyên nhân này? Tôi sử dụng URL tiêu chuẩn và cổng cho các bài kiểm tra (localhost: 3000).

Trả lời

6

Tôi đã giải quyết được sự cố của mình bằng cách sử dụng env['warden'].user. Dưới đây là phương pháp được cập nhật.

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

Điều này là không đủ. Bằng cách này, bạn vừa xóa lỗi khi người dùng đăng nhập. Nhưng nếu người dùng không đăng nhập - lỗi ** vẫn tồn tại **. Điều này là do 'App.room = App.cable.subscriptions.create" RoomChannel "' gọi 'bên trong room.coffee' (hoặc giống như trong mã của bạn). Giải pháp sẽ có điều kiện là 'room.coffee' phụ thuộc vào việc người dùng có đăng nhập hay không - nhưng điều đó sẽ yêu cầu loại trừ' room.coffee' khỏi nội dung - và hiển thị riêng của nó (vì bạn không thể render js nếu có điều kiện người dùng đăng nhập/đăng xuất). – prograils

Các vấn đề liên quan