[英]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.