2

認証、セッション管理に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の違いとは関係がないことを確認するためです。

4

1 に答える 1

2

うわー、Deviseセッションのタイムアウト、RailsまたはExtJSとは何の関係もないことが判明しました。

ドキュメントによると、使用されているバージョンに対して正しいと思われるNGINX構成を微調整することで最終的に解決されましたが、この問題の原因であることが判明しました。

現在のSSLサーバービット:

server {
            listen 443;
            ssl on;
            ssl_certificate      /srv/ssl/server.myapp.com.combined.crt;
            ssl_certificate_key  /srv/ssl/server.myapp.com.key;
            server_name server.myapp.com;
            root /var/www/myapp/current/public;
            passenger_enabled on;
            rails_env myapp_staging;
    }

私が持っていた前に:

server {
            listen 443 ssl;
            ssl_certificate      /srv/ssl/server.myapp.com.combined.crt;
            ssl_certificate_key  /srv/ssl/server.myapp.com.key;
            server_name server.myapp.com;
            root /var/www/myapp/current/public;
            passenger_enabled on;
            rails_env myapp_staging;
    }

違いは分裂しています

listen 443 ssl;

の中へ:

listen 443;
ssl on;
于 2012-12-28T07:20:07.973 に答える