NCMBとMONACAを使ってアプリ開発(ログインしっぱなしにする)


ログイン状態の継続

NCMBを利用したMONACAでのログインしっぱなしのソースをまとめる。
「セッショントークン」がめっちゃ重要なんだけど、そのへんよくわかってなかったので、先にセッショントークンをまとめる(今更何を?的な人は結論だけ読んでね)。

結論:

以下の結論です。
1.「セッショントークン」が切れてなければ、「getCurrentUser」メソッドを呼び出せばOK
2.「セッショントークン」が切れてれば結局ログインし直す必要がある。
3.CurrentUserがなかったら、これもログインし直し。

セッショントークンとは? ■用語まとめ

セッションとは

  • ある活動を継続している状態のこと。
  • 「セッション(session)」は「議会」「会議」「集会」あるいはその「開催期間」といった意味の英単語
  • ネット的には「通信状態が継続している」ということ
  • セッションが切れる → 通信状態が終了したってこと

トークンとは

  • そのときだけ有効になるパスワード
  • ワンタイムパスワードとかの単語のほうがわかりやすいと思う。そんな感じっぽい。

つまりセッショントークンとは??

  • 特定の時間だけ有効になるパスワードを発行し、通信OKな状態を継続すること

NCMBのログイン管理とは

ログイン管理では、Userクラスのloginとlogoutで、特定のユーザーでのログインの状態を管理しているっぽいです。

loginメソッドですること

  • ncmb.User.loginメソッドを呼ぶと、「セッショントークン」を作って、該当ユーザー権限で通信可能とする。
  • 同時にCurrentUserにログインしたUser情報を登録する

logoutメソッドですること

  • ncmb.User.logoutメソッドを呼ぶと、「セッショントークン」を消す。
  • 同時にCurrentUserを消す(多分、メモリを開放するって言うほうが正確)

じゃあ、logoutしないとずっとログインしっぱなしな感じ?→いや、セッション切れる

いいえ違います。アプリ再起動すると、セッションが切れます。

セッションが切れたらどうしたらいいの?

セッションが切れたら以下の2つの方法で対応ができます。
1.ログインし直す
2.currentUser情報をもっていれば、それを使ってログインし直す。

じゃあいっつも「currentUser」使えば良くない? → セッショントークンの「有効期限」を確認する必要がある。

カレントユーザーが作成されてから「24時間*」経つと、「セッショントークン」が「無効化」されます。無効化されたセッショントークンを利用してログインしても、すでにそのトークンは破棄されているから繋げない的なエラーになり、通信ができなくなります。

*初期状態だと24時間。アプリごとに設定を変更することが可能。

その場合には、結局ログインし直して、セッショントークンを取得し直さないとNG。CurrentUserは使えません。それどころかCurrentUserがいるとじゃまなんで、logoutした方がいいですね(って書いたけど、動き見てたらログインし直したら上書くからしなくてもよさそうだけど)

「有効期限」はどうやって確認する?

CurrentUserがもっているセッショントークンが使えるかどうかは、接続したらわかる。

サンプルソース

sample_loginを続ける
function checkCurrentUser(){
    var currentUser = ncmb.User.getCurrentUser();
    if (currentUser){
//    alert(JSON.stringify(currentUser));
        ncmb.User.fetch()
            .then(function(results){
//    alert("suc");
                console.log("currentUserName is " + currentUser.get("userName"));
            })
            .catch(function(err){
//    alert("err");
                ncmb.User.logout();
                //このあとはログイン画面を表示とか
            });
    } else {
        //未ログインの場合はログイン画面を表示とか
    }
}

つまり、「有効期間」を伸ばそう。

getCurrentUserでOK時間を伸ばせば、都度getCurrentUserを呼ぶことで自動ログインと同じ挙動になるはず。

もっかい結論:

ということで、以下の結論です。
1.「セッショントークン」が切れてなければ、「getCurrentUser」メソッドを呼び出せばOK
2.「セッショントークン」が切れてれば結局ログインし直す必要がある。
3.CurrentUserがなかったら、これもログインし直し。

メモ

  • CurrentUserには過去にログインした情報を保持している。
  • ログイン先はncmbのinitにもっているので、他のアプリとCurrentUserがかぶることはない。
  • 接続できなかったら、ローカルのセッショントークンを捨てる必要があるので、ログアウト処理する必要がある。

絶対間違っている図解

間違っている場所を指摘してください\(^o^)/

多分、セッショントークンの言葉の使い方とcurrentUserの場所が理解間違っている気がする。

参考URL:
http://mb.cloud.nifty.com/doc/current/tutorial/exchange-user-management.html
http://mb.cloud.nifty.com/assets/sdk_doc/javascript/jsdoc/files/lib_user.js.html#l19