繁体   English   中英

Rails Action Cable:授权来自移动设备的传入连接

[英]Rails Action Cable: Authorize the incoming connection from mobile devices

我想授权通过移动设备websocket 连接发出的连接请求。 我在Connection < ActionCable::Connection::Base中的代码如下:

module ApplicationCable
  class Connection < ActionCable::Connection::Base

    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

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

这对WebBrowser 客户端非常有效,因为我在用户使用Devise 登录系统后立即设置了cookie

该代码在 Devise 的SessionsController 中看起来像这样:

class Users::SessionsController < Devise::SessionsController

  # POST /resource/sign_in
  def create
    super
    cookies[:user_id] = current_user.id
  end

这工作正常。

但是当我尝试通过移动设备连接到 websocket 连接时,我收到了reject_unauthorized_connection错误。

当用户从移动设备api/signin时,我还尝试在api/signin api 中设置 cookie。 api 代码如下所示:

class Api::SessionsController < Api::ApiController

  def create
    user = User.find_by_email params[:email]

    if user && user.valid_password?(params[:password])

      # Set the user cookie
      cookies[:user_id] = user.id

      render json: { token: token_sign_in(user), user: user, department: user.department, organization: user.organization }
    else
      render json: { error: "invalid credentials" }, status: :unauthorized
    end
  end

发生错误是因为您无法在移动应用程序上设置 cookie 吗? 如果没有,那么在不使用 cookie 的情况下验证来自移动设备的传入 websocket 连接请求的下一个最佳方法是什么。

当尝试对来自移动设备的连接请求进行身份验证时,请使用移动应用程序在登录时发送到服务器的令牌唯一标识符(在我的情况下为电子邮件 ID) ,并带有标头。

所以,这些是我在connection.rb文件中所做的更改。

token = request.headers[:email]
  if token
    @verified_user = User.find_by(email: token)
  else
    reject_unauthorized_connection
  end

您还可以使用JWT 令牌而不是电子邮件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM