KUSAMAKURA

智に働けば角が立つ。情に棹させば流される。意地を通せば窮屈だ。とかくに人の世は住みにくい。

ncmb (NIFTY Cloud mobile backend) の logout メソッドの挙動

ncmb.User のログアウト挙動がAPIドキュメントを確認しても今ひとつ理解できなかったので、実際に実行結果を比較してみた。

APIドキュメントの確認

先ずは、APIドキュメントの記述を確認。

  1. User.logout ( callback ) (クラスメソッド

    カレントユーザ情報およびセッショントークンの破棄を行います。 カレントユーザに設定されていたインスタンス自体のセッショントークン情報は保持され続けます。 別途プロトタイプメソッドインスタンスのログアウトを実行してください。

  2. logout ( callback ) (プロトタイプメソッド

    インスタンスのセッショントークンの破棄を行います。 カレントユーザに設定されているユーザをこのメソッドでログアウトした場合でもカレントユーザ情報は破棄されません。 そのままAPIリクエストを行った場合、不正なセッショントークン利用でエラーが返ります。

挙動予想

A.の挙動予想。

  • カレントユーザ情報およびセッショントークンの破棄を行います。
    Local Strage に保存されたユーザ情報および、セッショントークンを破棄します。
  • カレントユーザに設定されていたインスタンス自体のセッショントークン情報は保持され続けます。
    インスタンスに設定されていたセッショントークン情報は保存され続けますよ。
  • 別途プロトタイプメソッドインスタンスのログアウトを実行してください。
    インスタンスのセッショントークン情報を破棄する場合は、別途プロトタイプメソッドでログアウトしてください。

B.の挙動予想。

  • インスタンスのセッショントークンの破棄を行います。
    インスタンスに設定されているセッショントークンを破棄します。
  • カレントユーザに設定されているユーザをこのメソッドでログアウトした場合でもカレントユーザ情報は破棄されません。
    カレントユーザに対してこのメソッドを使っても、Local Strageの情報は破棄されません。
  • そのままAPIリクエストを行った場合、不正なセッショントークン利用でエラーが返ります。
    このメソッド利用後、APIリクエストしても、セッションエラーになりますよ。

実行結果を比較

下記の3つに着目してメソッドの使用前後を比較してみた。

A. ncmb.User.logout() の挙動


▽before

  • ncmb.User.getCurrentUser()
#sign out user :{"userName":"a","password":"a","objectId":"%OBJECT_ID%","mailAddress":"dummy@gmail.com","mailAddressConfirm":false,"sessionToken":"ejLL2tVXSYwXPXrmpCSJgVW9b","createDate":"2015-11-12T08:23:44.076Z","updateDate":"2015-12-02T05:06:56.834Z","authData":null,"gender":"M"}
  • currentUser
#sign out user :{"userName":"a","password":"a","objectId":"%OBJECT_ID%","mailAddress":"dummy@gmail.com","mailAddressConfirm":false,"sessionToken":"ejLL2tVXSYwXPXrmpCSJgVW9b","createDate":"2015-11-12T08:23:44.076Z","updateDate":"2015-12-02T05:06:56.834Z","authData":null,"gender":"M"}
  • Local Storage
NCMB/%API_KEY%/currentUser
{"userName":"a","password":"a","objectId":"%OBJECT_ID%","mailAddress":"dummy@gmail.com","mailAddressConfirm":false,"sessionToken":"ejLL2tVXSYwXPXrmpCSJgVW9b","createDate":"2015-11-12T08:23:44.076Z","updateDate":"2015-12-02T05:06:56.834Z","authData":null,"gender":"M"}

▽after

  • ncmb.User.getCurrentUser()
null
  • currentUser
##sign out user :{"userName":"a","password":"a","objectId":"%OBJECT_ID%","mailAddress":"dummy@gmail.com","mailAddressConfirm":false,"sessionToken":"ejLL2tVXSYwXPXrmpCSJgVW9b","createDate":"2015-11-12T08:23:44.076Z","updateDate":"2015-12-02T05:06:56.834Z","authData":null,"gender":"M"}
  • Local Storage
データなし  

B. prototype.logout() の挙動


▽before

  • ncmb.User.getCurrentUser()
#sign out user :{"userName":"a","password":"a","objectId":"%OBJECT_ID%","mailAddress":"dummy@gmail.com","mailAddressConfirm":false,"sessionToken":"oeNOLRFRp7VhsskF4fKgMKp8c","createDate":"2015-11-12T08:23:44.076Z","updateDate":"2015-12-02T05:31:02.465Z","authData":null,"gender":"M"}
  • currentUser
#sign out user :{"userName":"a","password":"a","objectId":"%OBJECT_ID%","mailAddress":"dummy@gmail.com","mailAddressConfirm":false,"sessionToken":"oeNOLRFRp7VhsskF4fKgMKp8c","createDate":"2015-11-12T08:23:44.076Z","updateDate":"2015-12-02T05:31:02.465Z","authData":null,"gender":"M"}
  • Local Storage
NCMB/%API_KEY%/currentUser
{"userName":"a","password":"a","objectId":"%OBJECT_ID%","mailAddress":"dummy@gmail.com","mailAddressConfirm":false,"sessionToken":"oeNOLRFRp7VhsskF4fKgMKp8c","createDate":"2015-11-12T08:23:44.076Z","updateDate":"2015-12-02T05:31:02.465Z","authData":null,"gender":"M"}

▽after

  • ncmb.User.getCurrentUser()
null
  • currentUser
##sign out user :{"userName":"a","password":"a","objectId":"%OBJECT_ID%","mailAddress":"dummy@gmail.com","mailAddressConfirm":false,"sessionToken":null,"createDate":"2015-11-12T08:23:44.076Z","updateDate":"2015-12-02T05:31:02.465Z","authData":null,"gender":"M"}
  • Local Storage
データなし

結論

A.の挙動は、予想通りの挙動だったが、B.のプロトタイプメソッドの挙動が異なった。
予想では、Local Strageのカレントユーザ情報は破棄されないものと思われたが、削除されていた。
結局、クラスメソッドと、プロトタイプメソッドの挙動の違いは、下記のみだったと言える。

プロトタイプメソッドでログアウトした場合、クラスメソッドでのログアウトに加え、インスタンスに対して、セッショントークン値を破棄(nullを設定)している