サーバーと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_filter
れApplicationController
ます。
一部のリソースでは、ユーザーを認証および承認する必要があります。リクエストは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_filter
inとして設定されていApplicationController
ます。このようにして、CORSヘッダーを設定するフィルターがトリガーされ、すべてが正常に機能します。
Deviseのデフォルトの動作を使用したいのですが、CORSヘッダーを401応答で設定する必要があります。これを行う方法?そのためにワーデンを構成する必要がありますか?
独自の応答を作成する代わりに、Deviseによって生成された401応答にCORSヘッダーを設定するにはどうすればよいですか?