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