应用程序和actioncable不会共享cookie

时间:2015-12-24 13:23:47

标签: ruby ruby-on-rails-4 cookies devise actioncable

我正在使用设计进行身份验证,但是当我实施您的方法时,我得到了#34;未经授权的连接尝试被拒绝"

经过几个小时的搜索,我发现了:

cookies.signed['user.id']

返回nil。在以下代码块中。

def find_verified_user
  if verified_user = User.find_by(id: cookies.signed['user.id'])
    verified_user
  else
    reject_unauthorized_connection
  end
end

我检查了肯定有一个cookie,但它不包含Devise设置的cookie数据。

检查' user.id'实际上是设置我在视图中提升它。除外,这将返回用户ID

Signed in as @#{cookies.signed[:username]}.
- raise(cookies.signed['user.id'].inspect)
%br/
%br/
#messages
%br/
%br/
= form_for :message, url: messages_path, remote: true, id: 'messages-form' do |f|
 = f.label :body, 'Enter a message:'
 %br/
 = f.text_field :body
 %br/
 = f.submit 'Send message'

我的问题/解答:

似乎在actioncable服务器上没有cookie 有没有办法与有线服务器共享Devise设置的cookie?

https://github.com/stsc3000/actioncable-chat.git

4 个答案:

答案 0 :(得分:5)

检查连接到Action Cable服务器的客户端JavaScript文件。有些教程你把它放在'app / assets / javascripts / application_cable.coffee'和其他'app / assets / javascripts / channels / index.coffee'中,但它看起来像这样:

#= require cable

@App = {}
App.cable = Cable.createConsumer("ws://cable.example.com:28080")

您需要WebSocket地址指向您的有线电视服务器,并且该地址需要与您应用的其余部分共享Cookie命名空间。你很可能指向错误的地方,例如,如果你在本地工作,你需要改变:

App.cable = Cable.createConsumer("ws://cable.example.com:28080")

App.cable = Cable.createConsumer("ws://localhost:28080")

当然假设您的Cable服务器在端口28080上运行(在bin / cable可执行文件中指定)。 还要确保清除浏览器缓存,以便更新的文件是浏览器使用的文件。

答案 1 :(得分:3)

现在还不确定你是否运行它,但我在Rails 5.0.0.beta3上遇到了同样的问题。我没有更改为以下行:

NSString *path = [[NSBundle mainBundle] pathForResource:@"company-identifiers" ofType:@"plist"];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

我保持原样

App.cable = Cable.createConsumer("ws://localhost:3000")

但我所做的改变与Cookies有关。 无论什么。我的 user_id 的Cookie无法显示。所以我做了一个工作。我得到了cookie以保存用户名,然后我终于能够在find_verified_user函数调用中看到它。

用户登录后(Sessions #create),我调用了一个辅助函数:

 @App ||= {}
 App.cable = ActionCable.createConsumer()

新的find_verified_user

sessions_helper.rb
 def set_cookie(user)
    the_username = user.username.to_s
    cookies.permanent.signed[:username] = the_username
  end

这可能是也可能不是最佳解决方案,但经过几个小时的混乱和挫折后,这对我的情况起作用了。我希望这可以帮助某人

答案 2 :(得分:1)

您需要在config / initializers / session_store.rb中进行配置

# using cookie store
if Rails.env.production?
#  to share across subdomains
    Rails.application.config.session_store :cookie_store, 
                      key: '_app_name_session', domain: ".example.com"
else
# to share with any domain
    Rails.application.config.session_store :cookie_store, 
                      key: '_app_name_session', domain: :all, tld_length: 2
end

#for redis store
elsif Rails.env.production?
#  to share across subdomains
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: YourRedisHost, port: YourRedisPort},
      ],
      key: '_app_name_session',
      expire_after: 1.day,
      domain: '.example.com'
    }

else
# to share with any domain
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: YourRedisHost, port: YourRedisPort},
      ],
      key: '_app_name_session',
      expire_after: 1.day,
      domain: :all, 
      tld_length: 2
    }
end 

答案 3 :(得分:0)

我发现的问题是:我有2个不同的用户登录。一个登录于127.0.0.1,另一个登录于localhost。 因此,当我使用127.0.0.1:3000访问我的网站时,却将电缆配置为在本地主机上运行,​​如下所示:

  config.action_cable.url = "ws://localhost:3000/cable"

在config / environments / development.rb

以127.0.0.1登录的用户向“ ws:// localhost:3000 / cable”发出电缆请求(根据配置),但是即使我正在发出请求,也以此方式发送为localhost保存的cookie从127.0.0.1开始,这是另一个用户(或根本没有用户)。

因此,底部根实际上是Pwnrar指出的内容,电缆地址配置和访问网站的方式。

因此,要解决此问题,请始终使用为电缆配置的服务器地址访问您的网站,否则会混入cookie。