У меня есть приложение для рубинов на рейках, развернутое в крутящий момент. Мне нужно каким-то образом защитить websockets в моем приложении. Я использую stomp websockets, есть ли способ аутентифицировать пользователей, пока они делают соединение с веб-соединением? Я мог бы использовать параметры имени пользователя и пароля, но в настоящее время они игнорируются. Есть ли другой способ аутентификации этого соединения? Благодаря!Аутентификация клиентов стоп-стоп-серверов
ответ
Вы можете аутентифицировать сообщение в Stomplet, используя сеанс и сохраненный токен. Для этого вам нужно настроить Rails для использования хранилища сеансов Torquebox. Это может быть сделано с помощью инициализатора, например config/initializers/torquebox_init.rb
:
AppName::Application.config.session_store :torquebox_store
Теперь Stomplet будет иметь доступ к сессии. Вот пример Stomplet, который использует параметр сеанса :authentication_token
, чтобы соответствовать идентификатору пользователя_таблицы пользователя в базе данных. Маркер аутентификации проверяется на наличие подписки, отправив сообщение, и отпиской:
require 'torquebox-stomp'
class StompletDemo
def initialize()
super
@subscribers = []
end
def configure(stomplet_config)
end
def on_message(stomp_message, session)
token = session[:authentication_token]
if is_authenticated?(token)
@subscribers.each do |subscriber|
subscriber.send(stomp_message)
end
end
end
def on_subscribe(subscriber)
session = subscriber.session
if is_authenticated?(session[:authentication_token])
@subscribers << subscriber
end
end
def on_unsubscribe(subscriber)
session = subscriber.session
if is_authenticated?(session[:authentication_token])
@subscribers.delete(subscriber)
end
end
def is_authenticated?(token)
User.where(authentication_token: token).exists?
end
end
Теперь все, что вам нужно сделать, это убедиться в том, что при аутентификации пользователя session[:authentication_token]
устанавливается. В основном, это будет установлено в контроллере:
# user has successfully authenticates
session[:authentication_token] = @user.authentication_token
Для других людей, имеющих эту проблему, я решил это.
https://gist.github.com/j-mcnally/6207839
В основном маркер масштаба системы для меня техника его подводит, тем более, что я использую Завещание. Если вы хотите разместить свой веб-сайт в слове chrome extension, проще просто просто ввести имя пользователя/пароль для топания и управлять своими виртуальными сессиями подписчиков в стопплете. Это также позволяет вам делать некоторые забавные вещи, насколько вы нажимаете.