1

Sencha Touch 2 ライブラリを使用した開発はまったくの初心者です。このチュートリアルに従って、簡単なログイン スクリプトを作成しました ( http://miamicoder.com/2012/adding-a-login-screen-to-a-sencha-touch-application-part-2/ )。私が確信していないことの 1 つは、セッション トークンがクライアント側に存在するかどうかを確認して、アプリに戻ったときに認証されているかどうかをログイン画面に表示しないようにする方法です。

app.js

Ext.application({
    name: 'RecruitTalkTouch',
    views: ['Login', 'MainMenu'],
    controllers: ['Login'],
    launch: function () {
      Ext.Viewport.add([
        { xtype: 'loginview' },
        { xtype: 'mainmenuview' }
      ]);
    }
});

Login.js コントローラー:

Ext.define('RecruitTalkTouch.controller.Login', {
  extend: 'Ext.app.Controller',
  config: {
    refs: {
      loginView: 'loginview',
      mainMenuView: 'mainmenuview'
    },
    control: {
      loginView: {
        signInCommand: 'onSignInCommand'
      },
      mainMenuView: {
        signOffCommand: 'onSignOffCommand'
      }
    }
  },
  onSignInCommand: function(view, username, password) {
    var me = this,
        loginView = me.getLoginView();

    if(username.length === 0 || password.length === 0) {
      loginView.showSignInFailedMessage('Please enter your username and password.');
      return;
    }

    loginView.setMasked({
      xtype: 'loadmask',
      message: 'Signing In...'
    });

    Ext.Ajax.request({
      url: 'http://localhost:3000/api/v1/sessions.json',
      method: 'POST',
      useDefaultXhrHeader: false,
      params: {
        login: username,
        password: password
      },
      success: function(resp) {
        var json = Ext.JSON.decode(resp.responseText);

        if(json.success === "true") {
          me.sessionToken = json.auth_token;
          me.signInSuccess();
        } else {
          me.signInFailure(json.message)
        }
      },
      failure: function(resp) {
        me.sessionToken = null;
        me.signInFailure('Login failed. Please try again');
      }
    });
  },
  signInSuccess: function() {
    console.log("Signed In");
    var loginView = this.getLoginView(),
        mainMenuView = this.getMainMenuView();

    loginView.setMasked(false);

    Ext.Viewport.animateActiveItem(mainMenuView, this.transition('slide', 'left'));
  },
  signInFailure: function(message) {
    var loginView = this.getLoginView();
    loginView.showSignInFailedMessage(message);
    loginView.setMasked(false);
  },
  transition: function(type, direction) {
    return { type: type, direction: direction };
  },
  onSignOffCommand: function() {
    var me = this;
    me.sessionToken = null;
    Ext.Viewport.animateActiveItem(this.getLoginView(), this.transition('slide', 'right'));
  }
});

Login.js ビュー:

Ext.define('RecruitTalkTouch.view.Login', {
    extend: 'Ext.form.Panel',
    alias: "widget.loginview",
    requires: ['Ext.form.FieldSet', 'Ext.form.Password', 'Ext.Label', 'Ext.Button'],
    config: {
        title: 'Login',
        items: [
          {
            xtype: 'label',
            html: 'Login failed. Please enter the correct credentials.',
            itemId: 'signInFailed',
            hidden: true,
            hideAnimation: 'fadeOut',
            showAnimation: 'fadeIn'
          },
          {
            xtype: 'fieldset',
            title: 'Login',
            items: [
              {
                xtype: 'textfield',
                placeHolder: 'Username',
                itemId: 'userNameTextField',
                name: 'userNameTextField',
                required: true
              },
              {
                xtype: 'passwordfield',
                placeHolder: 'Password',
                itemId: 'passwordTextField',
                name: 'passwordTextField',
                required: true
              }
            ]
          },
          {
            xtype: 'button',
            itemId: 'logInButton',
            ui: 'action',
            padding: '10px',
            text: 'Log In'
          }
        ],
        listeners: [{
          delegate: '#logInButton',
          event: 'tap',
          fn: 'onLogInButtonTap'
        }]
    },
    onLogInButtonTap: function() {
      var me = this,
          usernameField = me.down('#userNameTextField'),
          passwordField = me.down('#passwordTextField'),
          label = me.down('#signInFailed'),
          username = usernameField.getValue(),
          password = passwordField.getValue();

      label.hide();

      var task = Ext.create('Ext.util.DelayedTask', function(){
        label.setHtml('');
        me.fireEvent('signInCommand', me, username, password);

        usernameField.setValue('');
        passwordField.setValue('');
      });

      task.delay(500);
    },
    showSignInFailedMessage: function(message) {
      var label = this.down('#signInFailed');
      label.setHtml(message);
      label.show();
    }
});
4

2 に答える 2

2

サーバーにチェック機能を追加して、有効なセッションをチェックする方が簡単な場合があります。Cookie があっても、ログアウトしていないというわけではなく、セッション Cookie はリクエストごとに送受信されます。

つまり、クライアントから Cookie にアクセスする場合、それらは単一の文字列値としてドキュメントに添付されます。document.cookies でアクセスできます。ExtJS cookie ユーティリティのドキュメントとソースを調べて、その文字列で自分の cookie を見つける方法についてのヒントを得たいと思います。

Ext.util.Cookies ドキュメント

Ext.util.Cookies ソース

基本的に、プロセスは Cookie 文字列の各文字を調べ、セッション キーの名前の長さまで部分文字列を取り出し、一致するかどうかを確認してから、次の等号とセミコロンの間のデータを取得します。次に、値をパーセントでエンコードしないと、準備完了です。

編集 サーバーに ping を実行するには、最初のビューが表示される前に、アプリケーションの読み込みプロセスのどこかで Ajax リクエストを行うだけです。起動機能は、私が思うに非常に自然な場所です。

Ext.application({
    name: 'App',

    requires: [],
    models: [],
    stores: [],
    views: [],
    controllers: [],

    ....

    launch: function () {
        //Check with the server
        Ext.Ajax.request({
            //Proxy Settings
            url: 'path/to/check/script.php',
            //Callbacks
            success: function (response, opts) {
                // process server response here
                response = Ext.JSON.decode(response.responseText);
                if(response && response.success === true) {
                    //Load the normal first view
                    Ext.Viewport.add(Ext.create('App.view.Main');
                } else {
                    //Load the login view
                    Ext.Viewport.add(Ext.create('App.view.LoginForm');
                }
            },
            failure: function (response, opts) {
                //Notify of network failure
            }
        });
    }
});

サーバー側のスクリプトで何をするかに関しては、開発している言語と認証対象に依存しています。ユーザー名とパスワードの単なるデータベースである場合は、ユーザーが最初にログインしたときにセッションを開始し、ユーザー ID とパスワードのセッション変数を保存します。チェック機能では、最初に現在のセッションが存在するかどうかをチェックしてから、データベースに対して再認証することで、それらがまだ有効であることを確認します (セッションがまだ有効な間にあなたまたは他の誰かがアカウントをキャンセルした場合)。次に、ログインしているかどうかを示し、アプリを機能させるために必要な関連ユーザー情報を含む json 応答を返すだけです。

于 2013-11-04T02:28:55.177 に答える
0

Sencha Touch では:

var cookiestr = document.cookie.split('; ');
var cookieObjArr = new Array();

for (var i=0; i<cookiestr.length; ++i)
{
    if (i in cookiestr)
    {
        tmp = cookiestr[i].split('=');
        cookieObjArr.push({"key": tmp[0], "value": tmp[1]});
    }
}
于 2015-02-06T10:40:44.703 に答える