認証、セッション管理にDevise(Timeoutableが有効)を使用するRuby onRails3.2バックエンドを備えたExtJS4.1アプリがあります。
この問題は、アプリがSSL経由でのみ提供されるサーバーで発生します。Nginxは、セキュリティで保護されていないリクエストをhttpsurlにリダイレクトします。
問題は、Deviseセッションがタイムアウトになると、私の場合は15分後に、AJAXリクエストがhttps://myapp.com/controllerではなくhttp://myapp.com/controller?paramsに送信/リダイレクトされることです。?params、通常どおり。
私はクライアント側のコードを持っています。非SSLセットアップでは、潜在的なセッションの期限切れの問題をキャッチするのにうまく機能し、セッションがタイムアウトしたというメッセージとともにログインページにリダイレクトします。これは、セッションがタイムアウトした後にリクエストが行われると、「無効なJSON文字列」エラーメッセージが返されるという事実に基づく一種のハックです。エラーには、ログインページのHTMLが含まれています。これは、ユーザーがログインしたときにjsonであると想定される応答が、セッションタイムアウト時にアプリがリダイレクトされることになっているログインページになるためです。このコードブロックは、Ext.applicationの起動メソッド内にあります。
launch: function () {
Ext.Error.handle = function (err) {
$.post('/logs', {message:err.msg});
if (err.msg.indexOf("invalid JSON String") != -1 && err.msg.indexOf("<!DOCTYPE html>") != -1) {
if (err.msg.indexOf("MyApp_Login") != -1)
document.location.href = "/logout?timeout=1";
else
document.location.href = "/logout?error=1";
} else {
gritter(3, "ERROR:", "A client-side error has occurred. If this issue persists, please contact your system administrator.");
if (Ext.isWebKit) console.log(err);
}
}
if (user_signed_in == true) {
Ext.require('MyDesktop.App');
Ext.require('Ext.tab.*');
_myDesktopApp = Ext.create('MyDesktop.App');
Ext.state.Manager.setProvider(Ext.create('Ext.state.CookieProvider'));
}
}
したがって、前述したように、非セキュアソケットを介して、アプリはセッションがタイムアウトしたことを示すコントローラー要求(より正確には応答)を検出し、適切なアクションを実行します。しかし、私のサーバーでは、SSLを介して、何らかの理由で、セッションが期限切れになると、コントローラーの呼び出しはhttpsではなくhttpを介して行われることになります。Chromeでこのようなエラーが発生する:
The page at https://server.myapp.com/ displayed insecure content from http://server.app.com/campaign_components_contacts.json?authenticity_token=1vokGHUpsi5w3b3P8mrfUpEGx19hrHJpsCzPayofM7c%3D&campaign_id=2&component_id=2&contact_id=1536&format=json
これはExtJSの機能であり、SSLを介して問題が検出されたときに非セキュアな呼び出しを試行しますか?またはRailsのいくつかの機能?どちらでもないと思いますが、頭に浮かんだものを捨てるだけです。
編集:
--sslスイッチでthin を使用することにより、開発環境でローカルにシナリオをテストすることができました。サーバーが起動したら、
https://localhost:3000
問題ありません。Deviseセッションが期限切れになると、jsonリクエストはすべて、期待どおりにログインへのリダイレクトをトリガーし、http上で機能します。
したがって、この質問で説明されている問題は私のサーバーでのみ発生し、おそらく私のNGINX構成の設定方法に関係しています。
また、アプリをローカルでプリコンパイルし、prod環境オプションを使用して実行します。これは、devとprodの違いとは関係がないことを確認するためです。