Rails Action Cable: авторизуйте входящее соединение с мобильных устройств - PullRequest
0 голосов
/ 18 марта 2020

Я хочу авторизовать запросы на соединение, отправленные на соединение через веб-сокет через мобильные устройства . Код, который у меня есть в 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 , поскольку я установил cookie как как только пользователь входит в систему, используя Devise .

Этот код выглядит примерно так в SessionsController от Devise:

class Users::SessionsController < Devise::SessionsController

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

Это работает нормально.

Но когда я пытаюсь подключиться к веб-сокету через мобильный телефон, я получаю reject_unauthorized_connection ошибка.

Также я попытался установить куки в api/signin api, когда пользователь входит в систему с мобильного телефона. 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.

1 Ответ

0 голосов
/ 20 марта 2020

При попытке аутентификации запросов на подключение с мобильного устройства используйте токены или уникальные идентификаторы (идентификатор электронной почты в моем случае) , которые мобильное приложение отправляет на сервер при входе в систему, с заголовком.

Итак, это изменения, которые я сделал в моем файле connection.rb.

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

Вы также можете использовать JWT токен вместо электронное письмо.

...