質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Ruby

    9435questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails 4

    2544questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • WebSocket

    201questions

    WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

  • Action Cable

    24questions

    Action Cableは、WebSocketをRailsに組み込む機能。Rails4でオプションとして存在していたWebSocketをRails5で標準機能したものです。Railsアプリケーションと同様のスタイルで、Rubyを用いたリアルタイム機能を記述できます。

Rails4 + ActionCableでのcookieの取り扱いについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,539

supiar17

score 4

Ruby on Rails 4 + ActionCableを用いて下記のチャットシステムを作成しています。

<参考記事>
http://qiita.com/totzyuta/items/556d1bae65bb918db322
http://www.rubytutorial.io/actioncable-devise-authentication/

<実現したいこと>
ユーザ同士のコミュニケーションを実現したい。
基本的には1vs1のコミュニケーションで、他のユーザからは二人のやりとりは参照できないようにしたい。

<サーバ構成>
セキュアな通信を確保するためssl通信を用いています。

また、利用しているクラウドサービスのロードバランサがwss通信をサポートしていないため、
通常のアクセスはhttps通信でロードバランサに、
チャット利用時のwss通信はアプリケーションサーバに振り向けています。

なお、通常アクセスとチャット利用は下記のようにサブドメインをつけることで、
クライアント側に分別させています。

ロードバランサ → lb.example.com
アプリケーションサーバ → chat.example.com

<ActionCable周りの設定>
本仕様を実現するにあたって、必要と思われる設定ファイルのみ記述いたします。

-- クライアントサイド --
app/assets/javascripts/channels/index.coffee

#= require cable
#= require_self
#= require_tree

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

-- サーバサイド --
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 verified_user = User.find_by(id: cookies[:user_id])
                    verified_user
                else
                    reject_unauthorized_connection
                end
            end
    end
end

config/environments/initializers/session_store.rb

# Be sure to restart your server when you modify this file.

Rails.application.config.session_store :cookie_store, key: '_example_session', domain: :all

cable/config.ru

# cable/config.ru
require ::File.expand_path('../../config/environment',  __FILE__)
Rails.application.eager_load!

require 'action_cable/process/logging'
ActionCable.server.config.allowed_request_origins = ['lb.example.com']
run ActionCable.server

下記コマンドでWebSocketサーバを立ち上げています。

bundle exec puma -p 28080 cable/config.ru

<起こっている問題>
アプリケーションサーバでユーザ認証後、
cookies[:user_id] = @user.id
のような形でcookieに:user_idをセットし、同アプリケーション内であればどのアクションからも:user_idを取得することができます。
しかし、websocketの方では、以下のログの通り、:user_idがnilとなってしまい、認証ができません。

Started GET "/" [WebSocket] for 126.72.113.68 at 2016-08-15 05:34:31 +0000
  User Load (1.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
An unauthorized connection attempt was rejected

私の認識ですと、session_storeの設定により、サブドメインは共通のcookieを利用できると考えていたため、
このシーンで:user_idがnilと認識される理由が全く分からず困っています。

どなたかお力添えいただけませんでしょうか。
以上、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

cookieが使えないので、リクエストパラメータに暗号化した固有IDを持たせれば良かった模様です。

<参考>
https://herenow.pw/article/rails-actioncable-on-different-domain/

自己解決しましたのでクローズいたします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Ruby

    9435questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails 4

    2544questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • WebSocket

    201questions

    WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

  • Action Cable

    24questions

    Action Cableは、WebSocketをRailsに組み込む機能。Rails4でオプションとして存在していたWebSocketをRails5で標準機能したものです。Railsアプリケーションと同様のスタイルで、Rubyを用いたリアルタイム機能を記述できます。