Rails Mount Cable

I am trying to get Action Cable to work with Devise.

module ApplicationCable class Connection < ActionCable::Connection::Base identified_by :current_user def connect self.current_user = find_verified_user logger.add_tags 'ActionCable', current_user.name end protected def find_verified_user verified_user = User.find_by(id: cookies.signed['user.id']) if verified_user && cookies.signed['user.expires_at'] > Time.now verified_user else reject_unauthorized_connection end end end end 

If the user is logged in, I still get nil from cookies.signed['user.id']

+5
source share
2 answers

Update connection.rb as follows:

 module ApplicationCable class Connection < ActionCable::Connection::Base identified_by :current_user def connect self.current_user = find_verified_user logger.add_tags 'ActionCable', current_user.studentid end protected def find_verified_user # this checks whether a user is authenticated with devise if verified_user = env['warden'].user verified_user else reject_unauthorized_connection end end end end 

Link: http://tutorials.pluralsight.com/ruby-ruby-on-rails/implementing-a-custom-devise-sign-in-and-actioncable-rails-5?saved=1&status=in-review

+7
source

Try setting your cookie in the boss callback.

Add the file to `config / initializers / your_file.rb``

Add this to the file:

 Warden::Manager.after_set_user do |user, auth, opts| scope = opts[:scope] auth.cookies.signed["#{scope}.id"] = user.id auth.cookies.signed["#{scope}.expires_at"] = 60.minutes.from_now end Warden::Manager.before_logout do |user, auth, opts| scope = opts[:scope] auth.cookies.signed["#{scope}.id"] = nil auth.cookies.signed["#{scope}.expires_at"] = nil end 

Or you can do something like this:

 verified_user = env['warden'].user 

As explained in this very pleasant case: https://www.sitepoint.com/create-a-chat-app-with-rails-5-actioncable-and-devise/

+4
source

All Articles