2015-08-15 16 views
3

Я нашел замечательный драгоценный камень ActionCable, который является хорошим решением для SPA.Аутентификация ActionCable connections

Я хочу послать только html, css и js активы, все остальные соединения будут осуществляться через ActionCable. Нетрудно обменивать строки или целые числа, но как я могу войти в ActionCable?

+0

Логин должно быть сделано с помощью обычного Rails путь, вы можете проверить проверка подлинности пользователя ли, как описано здесь: https://github.com/rails/ actioncable –

+0

Я знаю, что могу это сделать, но мне нужен весь сайт, работающий через websockets. Могу ли я это реализовать? – asiniy

ответ

-2

Решение заключается в использовании токена авторизации HTTP. Это просто, широко и очевидно. This article помог мне

6

От Readme

# app/channels/application_cable/connection.rb 
module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    identified_by :current_user 

    def connect 
     self.current_user = find_verified_user 
    end 

    protected 
     def find_verified_user 
     if current_user = User.find(cookies.signed[:user_id]) 
      current_user 
     else 
      reject_unauthorized_connection 
     end 
     end 
    end 
end 

Так это выглядит, как вы могли бы вставить свою собственную логику find_verified_user здесь. Метод reject_unauthorized_connection живет в lib/action_cable/connection/authorization.rb для справки.

От Heroku:

[аутентификация] может быть сделана различными способами, как WebSockets будет проходит через стандартные заголовки HTTP обычно используется для проверки подлинности. Это означает, что вы можете использовать тот же механизм аутентификации, который вы используете , используя для просмотра в Интернете соединения WebSocket.

Поскольку вы не можете настраивать заголовки WebSocket из JavaScript, вы ограничены «неявным» auth (например, Basic или cookies), который отправляется из обозревателя . Кроме того, распространено, что сервер, который обрабатывает , WebSockets полностью отделен от одной обработки «нормального» HTTP-запроса . Это может затруднить разделение общих заголовков полномочий или невозможно.

Имея это в виду, что это, вероятно, будет реальная боль не просто использовать нормальный поток веб-входа, чтобы установить куки аутентификации, обеспечивая ваш SPA после стадии аутентификации, но мы надеемся, что это может дать вам несколько советов.

0

FYI, если вы devise уже установлена ​​в вашем приложении, то вы можете использовать переменную окружения, установленную warden найти authenticated user. Для каждого аутентифицированного пользовательского наблюдателя хранится пользовательский объект в среде var. Каждый запрос аутентифицируется посредством промежуточного программного обеспечения warden.

Примечание: env отличается от ENV.

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

    def connect 
     self.current_user = find_verified_user_from_env 
    end 

    private 
    def find_verified_user_from_env 
     # extracting `user` from environment var 
     current_user = env['warden'].user 
     if current_user 
     current_user 
     else 
     reject_unauthorized_connection 
     end 
    end 
    end 
end 

Если вы не использовали devise то здесь другое решение. Предпосылкой является то, что вам нужно будет установить подписанный файл cookie с именем user_id в вашем sessions_controller или что-то в этом роде. например

cookies.signed[:user_id] = current_user.id 

и для связи:

# app/channels/application_cable/connection.rb 
module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    identified_by :current_user 

    def connect 
     self.current_user = find_verified_user_from_cookies 
    end 

    private 
    def find_verified_user_from_cookies 
     current_user = User.find_by_id(cookies.signed[:user_id]) 
     if current_user 
     current_user 
     else 
     reject_unauthorized_connection 
     end 
    end 
    end 
end