首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证ActionCable连接

验证ActionCable连接
EN

Stack Overflow用户
提问于 2015-08-15 14:54:45
回答 3查看 6.6K关注 0票数 4

我找到了一个很好的ActionCable gem,这是一个很好的解决方案。

我只想发送htmlcssjs资产,所有其他连接都将通过ActionCable实现。交换字符串或整数并不困难,但是如何通过ActionCable登录呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-02 16:44:05

解决方案是使用HTTP授权令牌。这很简单,很普遍,很明显。这篇文章帮了我很多忙

票数 -8
EN

Stack Overflow用户

发布于 2015-08-25 14:47:20

来自自述

代码语言:javascript
复制
# app/channels/application_cable/connection.rb
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    protected
      def find_verified_user
        if current_user = User.find(cookies.signed[:user_id])
          current_user
        else
          reject_unauthorized_connection
        end
      end
  end
end

所以看起来您可以在这里插入您自己的find_verified_user逻辑。reject_unauthorized_connection方法驻留在lib/action_cable/connection/authorization.rb中以供参考。

来自赫鲁库

身份验证可以通过多种方式进行,因为WebSockets将通过通常用于身份验证的标准headers。这意味着您也可以使用与WebSocket连接上的web视图相同的身份验证机制。 由于不能从WebSocket中自定义JavaScript头,所以只能使用从浏览器发送的“隐式”auth (即Basic或cookies)。此外,处理WebSockets的服务器通常与处理“正常”HTTP请求的服务器完全分离。这会使共享授权标头变得困难或不可能。

考虑到这一点,不只是使用正常的web登录流来设置auth cookie,在身份验证步骤之后交付SPA,这可能是一个真正的痛苦,但希望这可以给您一些提示。

票数 6
EN

Stack Overflow用户

发布于 2017-05-15 02:39:55

FYI,如果您已经在应用程序中安装了devise,那么可以使用warden设置的环境变量来查找authenticated user。对于每个经过身份验证的用户,典狱长都将用户对象存储在环境var中。每个请求都由warden中间件进行身份验证。

Note:这个环境ENV不同。

代码语言:javascript
复制
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user_from_env
    end

    private
    def find_verified_user_from_env
      # extracting `user` from environment var
      current_user = env['warden'].user
      if current_user
        current_user
      else
        reject_unauthorized_connection
      end
    end
  end
end

如果您没有使用devise,下面是另一个解决方案。前提是,您必须在您的user_id中设置一个名为sessions_controller之类的签名cookie。例如

代码语言:javascript
复制
cookies.signed[:user_id] = current_user.id

为了连接:

代码语言:javascript
复制
# app/channels/application_cable/connection.rb
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user_from_cookies
    end

    private
    def find_verified_user_from_cookies
      current_user = User.find_by_id(cookies.signed[:user_id])
      if current_user
        current_user
      else
        reject_unauthorized_connection
      end
    end
  end
end
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32025897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档