2015-08-15 2 views
3

J'ai trouvé une précieuse gemme ActionCable, qui est une bonne solution pour SPA.Authentification des connexions ActionCable

Je veux envoyer seulement les html, css et js actifs, toutes les autres connexions seront mises en œuvre par le biais ActionCable. Il n'est pas difficile d'échanger des chaînes ou des entiers, mais comment puis-je me connecter via ActionCable?

+0

Connexion doit être fait en utilisant Rails façon habituelle, vous pouvez vérifier si l'utilisateur est authentifié comme expliqué ici: https://github.com/rails/ actioncable –

+0

Je sais que je peux le faire, mais j'ai besoin que tout le site fonctionne à travers les websockets. Puis-je implémenter ceci? – asiniy

Répondre

-2

La solution consiste à utiliser le jeton d'autorisation HTTP. C'est simple, répandu et évident. This article m'a beaucoup aidé

6

De l'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 

Il semble donc que vous pouvez insérer votre propre find_verified_user logique ici. La méthode reject_unauthorized_connection vit dans lib/action_cable/connection/authorization.rb pour référence.

De Heroku:

[authentification] peut être fait dans une variété de façons, comme WebSockets sera passe par les en-têtes HTTP standard couramment utilisé pour l'authentification. Cela signifie que vous pouvez utiliser le même mécanisme d'authentification que celui que vous utilisez pour vos vues Web sur les connexions WebSocket.

Étant donné que vous ne pouvez pas personnaliser les en-têtes WebSocket à partir de JavaScript, vous êtes limité à l'authentification "implicite" (c'est-à-dire Basic ou les cookies) envoyée par le navigateur . De plus, il est courant que le serveur qui gère les WebSockets soit complètement séparé de celui qui traite les requêtes HTTP "normales" . Cela peut rendre difficile les en-têtes d'autorisation partagés ou impossible.

Dans cet esprit, il serait probablement une vraie douleur de ne pas simplement utiliser un flux de connexion Web normale pour définir votre cookie auth, la livraison de votre SPA après l'étape d'authentification, mais nous espérons que cela peut vous donner quelques conseils.

0

Pour votre information, si vous avez devise déjà installé dans votre application, vous pouvez utiliser la variable d'environnement définie par warden pour trouver le authenticated user. Pour chaque utilisateur authentifié, le gardien stocke l'objet utilisateur dans l'environnement var. Chaque requête est authentifiée par le middleware warden.

Remarque: ce env est différent de 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 

Si vous ne l'avez pas utilisé devise alors, voici une autre solution. La condition est, vous devrez définir un cookie signé appelé user_id dans votre sessions_controller ou quelque chose comme ça. par exemple

cookies.signed[:user_id] = current_user.id 

et pour la connexion:

# 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