サーバーとapiを消費するクライアントが別のドメインに属しているので、CORSを使用したいと考えています。そうするために、私は、サーバーの応答に対応するHTTPヘッダーを設定する必要があります。ユーザーが承認していない場合にDeviseでCORSヘッダーを送信する方法(401応答)
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
この方法はApplicationController
でbefore_filter
として使用されています。
一部のリソースでは、ユーザーを認証して認証する必要があります。リクエストはXHR/Ajax経由で行われます。したがって、ユーザーが認証されていない場合、Deviseは、サインインページにリダイレクトするのではなく、クライアントに401応答を送信します。しかし、CORSヘッダーを設定するフィルターはその応答には使用されません。したがって、401応答はクライアントに送信されません。クライアントで401応答を捕捉して使用したいと思います。
現在、私は工夫の認証方法を使用していないことで回避策を使用しますが、カスタム認証抜粋しています:
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
これはあまりにもApplicationController
でbefore_filter
、として設定されています。この方法でCORSヘッダーを設定するフィルターが起動され、すべて正常に動作します。
私はDeviseのデフォルトの動作を使用したいと思いますが、CORSヘッダーは401応答で設定する必要があります。これを行う方法?それにはwardenを設定する必要がありますか?
私自身の応答を作成する代わりに、Deviseによって生成された401応答に対してCORSヘッダーを設定するにはどうすればよいですか?
それでも私はそのためのソリューションを持っていない:CORSハンドラが監視員の前にあるように、ミドルウェアの順序を指定します。もっと文脈を与えるために、私がこれをどのように使っているかについて私のブログ記事をチェックしてください:http://nils-blum-oeste.net/cors-api-with-oauth2-authentication-using-rails-and-angularjs –