8

認証にデバイスを使用していますが、あなたの方法を実装すると、「不正な接続試行が拒否されました」というメッセージが表示されました

何時間も検索した結果、次のことがわかりました。

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

4 に答える 4

3

今までに実行できたかどうかはわかりませんが、Rails 5.0.0.beta3 で同じ問題が発生しました。次の行に変更しませんでした。

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

以前のままにしておきました

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

しかし、私が変更したのは Cookie に関係していました。何があっても私のuser_idの Cookieは表示されません。だから私は回避策を作りました。代わりにユーザー名を保存するための Cookie を取得したところ、find_verified_user 関数呼び出しで最終的に確認できました。

ユーザーがログインした後 (Sessions#create)、ヘルパー関数を呼び出します。

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

新しい find_verified_user

  def find_verified_user
    if current_user = User.find_by_username(cookies.signed[:username])
      current_user
    else
      reject_unauthorized_connection
    end
  end

これは最善の解決策である場合とそうでない場合がありますが、何時間もの混乱と欲求不満の後、これは私の状況でうまくいきました. これが誰かを助けることができることを願っています

于 2016-04-19T13:49:19.547 に答える