18

サーバーとAPIを消費するクライアントが異なるドメインに存在するアプリで作業しているので、 CORSを使用したいと思います。そのためには、サーバーの応答に対応するhttpヘッダーを設定する必要があります。

def cors_set_access_control_headers
  headers['Access-Control-Allow-Origin'] = 'http://localhost'
  headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
  headers['Access-Control-Allow-Headers'] = '*, X-Requested-With, X-Prototype-Version, X-CSRF-Token, Content-Type'
  headers['Access-Control-Max-Age'] = "1728000"
end

このメソッドは、で使用さbefore_filterApplicationControllerます。

一部のリソースでは、ユーザーを認証および承認する必要があります。リクエストはXHR/Ajaxを介して行われます。したがって、ユーザーが認証されていない場合、Deviseはサインインページにリダイレクトする代わりに、クライアントに401応答を送信します。ただし、CORSヘッダーを設定するためのフィルターは、その応答には使用されません。したがって、401応答はクライアントに送信されません。クライアントで401応答をキャッチして使用したいと思います。

現在、Devise認証方法ではなく、カスタム認証スニペットを使用することで回避策を使用しています。

def authenticate_cors_user
  if request.xhr? && !user_signed_in?
    error = { :error => "You must be logged in." }
    render params[:format].to_sym => error, :status => 401
  end
end

これもbefore_filterinとして設定されていApplicationControllerます。このようにして、CORSヘッダーを設定するフィルターがトリガーされ、すべてが正常に機能します。

Deviseのデフォルトの動作を使用したいのですが、CORSヘッダーを401応答で設定する必要があります。これを行う方法?そのためにワーデンを構成する必要がありますか?

独自の応答を作成する代わりに、Deviseによって生成された401応答にCORSヘッダーを設定するにはどうすればよいですか?

4

2 に答える 2

21

私はrack-corsgemhttps://github.com/cyu/rack-corsを正常に使用、ブログで自分の経験を概説しました。

パンチライン:ミドルウェアの順序を指定して、corsハンドラーがワーデンの前になるようにします。

config.middleware.insert_before Warden::Manager, Rack::Cors
于 2012-10-16T21:44:15.623 に答える
0

一般的に、CORSヘッダーは嫌いでした。リダイレクトにはHAProxyを使用することをお勧めします。

HAProxyを使用すると、website.com / api /に送信されるすべてのリクエストを、内部でRailsマシンにリダイレクトするように設定できます。

frontend main *:80
  acl api      path_beg  -i /api
  acl app      path_beg  -i /app
backend app_backend
  reqrep    ^([^\ ]*)\ /app/(.*)  \1\ /\2
  balance   roundrobin
  server    app_files smartphoneapp.localhost:8000
backend api_backend
  reqrep    ^([^\ ]*)\ /api/(.*)  \1\ /\2
  balance   roundrobin
  server    app_api localhost:3000
于 2012-06-26T12:03:16.700 に答える