0

私の質問は、タイトルが想定しているよりも少し複雑です。

2 つの Rails4 アプリがあります。両方とも、mongoid 経由で同じ mongodb にアクセスします。どちらも認証に devise 3.0.0 を使用し、両方とも devise 対応の同じユーザー モデルを持ち、同じコレクションを使用します。

最初のアプリは、ドメインで API のみを配信します。

api.myapp.com

2 つ目のアプリは、関連する Web サイトを

myapp.com

さらに、以下から JS シングルページ アプリケーションを配信します。

app.myapp.com

後者は問題なく API にアクセスでき、デバイス上で自作のトークン認証パッチを使用して、トークンを HTTP ヘッダーとして転送できるようにします。

どちらの Rails アプリも、次の場所に同じコンテンツがあります。

config/initializers/devise.rb
config/initializers/secret_token
config/initializers/session_store

後者は次のようになります。

Web::Application.config.session_store :cookie_store, key: '_myapp_session', domain: :all

バックボーン ベースの単一ページ アプリケーションで現在行っていることは次のとおりです。

  1. アプリにログインします
  2. アプリは API から auth_token を取得します
  3. アプリはトークンを保存します
  4. シングル ページ アプリケーションは、トークンを使用していくつかの追加リソースを要求します。
  5. 応答ヘッダーは Cookie を設定します

Cookie が設定されているので、Rails Web サイトの myapp.com にもログインできると思います。残念!私はそうではありません。

したがって、APIの問題を偽造するために、次のことを行います。

  1. Chrome で REST クライアントを起動します
  2. このクライアントを使用して API にログインし、トークンを取得します
  3. クライアントとトークンを使用して 1 つの追加リソースをリクエストします
  4. 応答ヘッダーは Cookie を設定します
  5. Rails の Web サイトにアクセスすると、ログインできました。

私はその行動について混乱しています。リソースが要求され、ユーザーがログインすると、API は正しい Cookie を配信するようです。それ以外の場合、REST クライアントを使用した後、Web サイトにログインできません。

しかし、シングル ページ アプリが REST クライアントとまったく同じように動作し、Cookie を設定する応答ヘッダーも受信する場合、Web サイトにログインしていません。

誰にもヒントはありますか?

よろしくフェリックス

4

2 に答える 2

1

中央認証サーバーCASを使用してから、各アプリケーションで omniauth gem を使用して、両方のアプリケーションで facebook または twitter ログインを使用するのとまったく同じ方法でサインインできます。

これにより、Cookie とチケットを自分で処理するという頭痛の種が解消されます。

インストールと使用が簡単なCASINOを使用でき、 omniauth-casでomniauthを使用できます

また、omniauth gem をデバイスに統合するのと同じ方法で統合できます。

于 2014-08-18T19:05:36.420 に答える
0

完全修飾ドメイン名を含まないドメイン パラメーターを追加して、Cookie に特定のスコープを設定する必要がある場合があります。

「api.myapp.com」または「www.myapp.com」の下にある Cookie の代わりに、「myapp.com」として参照して共有する必要があります。

例 :

cookies[cookie_name] = {:value =>token, :domain => 'myapp.com'}

それが役立つことを願っています!

于 2013-08-23T01:07:11.597 に答える