【自動ログイン機能】機種変更でアカウントを引継ぐ方法


はじめに

ふとこんなことを考えました。最近流行の「自動ログイン機能」を実装しているアプリを使っていて、もし機種変更をしたら、アカウントはどうやって引き継がれるんだろう?

自動ログインって、ユーザーにはログイン/ログアウトを意識させずに行うので、
機種変更したらアカウントの引継ぎってどうなるの?と思ったわけです。
そこで考えてみました!!!

ちょうどニフティクラウド mbile backend (以下mBaaS)を使って「自動ログイン機能」自体の実装は出来ていたので、これを使って実現してみることにしました。

参考
「自動ログイン機能」についてはこちらに記事があります▼
[Qiita]サーバー開発を一切せずに自動ログイン機能を実現してみた

ちなみに、自分はサーバーエンジニアではないので、mBaaS をフル活用して、サーバー周りの開発一切なしで作っています◎(ついでに無料で)

機能はできたぞ!ただ…ロジックの説明が中々難しい…

この機能を実現したとき、説明するのにとても苦労しました;
アカウントの移り変わり を言葉で伝えるのはもちろん、絵に描いて説明するのもなかなか苦をしました…そこでアカウント自体を図にしてみました。(ちゃんと伝わるといいなー。)

本編に進む前に
前提条件と事前知識についての話

自動ログイン機能について

「自動ログイン」機能は以下のような処理を行っています。

  • アプリ起動時に端末固有のUDID(ユニークデバイスID)を取得し、それを「userName(ユーザー名)/password(パスワード)」としてログインを行う
  • acl(参照権限)設定を以下のようにする
    • read(読み込み)権限 → public true (全員許可)
    • write(書き込み)権限 → user true (会員のみ許可)

例)端末固有のUDIDが「UUID_A」の場合
以下のようにmBaaS上にアカウントを作成し、アプリの裏側で処理をします。

ユーザーからはアカウントの存在は見えません!

参考
イメージが沸きにくい場合はサンプルを動かしてみましょう▼
[Qiita]サーバー開発を一切せずに自動ログイン機能を実現してみた

前提条件

以下の前提条件の下、考えていきます。

  • 前述の「自動ログイン機能について」の自動ログインを使用します
    • ただし、起動時に引継ぎをするか、そのまま自動ログインをしてアプリを始めるのか、選択できるようにしておきます。
  • 端末Aから端末Bへ機種変更した場合について考えます
  • 端末AのUDIDを「UUID_A」、端末BのUDIDを「UUID_B」とします
  • 端末Aで使用していたアカウントを、端末Bでも引き継いで利用します

本編:「自動ログイン」アプリのアカウント引越し方法

次の3段階に分けて解説します。

その前にゴールをイメージしておきましょう!

アカウント引継ぎイメージ(ゴール)

端末Aで使っていたアカウントを引き継いでそのまま使います。この方法では、まず端末間の引継ぎ認証を行い、アカウント上に引継ぎ先のUUIDを登録するしています。登録したUUIDを持って検索をし、userNameを取得することで元のユーザーとしてログインできるため、引継ぎが実現できます。

では詳細見てみましょう!

《処理1》移行前:「引継ぎ認証を行うための情報を設定する」

ユーザー側の動作

  • 引継ぎ元の端末Aでアプリを起動(自動ログイン)して、「メールアドレス」と「移行用の一時パスワード」を設定する

<画面イメージ>

アプリ側の処理

以下のようにしてアカウント移行時の認証のための情報を設定します。

  • 端末Aで自動ログインした状態なので、UserNameが「UUID_A」のアカウントでログインされた状態にある
  • ユーザーが登録した「メールアドレス」と「移行用の一時パスワード」を、それぞれアカウントの「mailAddress」「temporaryPass」フィールドに登録する
  • ↑と同時に、アカウント移行中であることを認識するために「flag」フィールドに「true」を設定しておく

<アカウントイメージ>

《処理2》移行中:「引継ぎの認証と新しい端末の情報を会員情報に設定する」

ユーザー側の動作

  • 引継ぎ先の端末Bでアプリをダウンロードする
  • ダウンロードしたアプリを起動してアカウントの引継ぎ処理として、「メールアドレス」と「移行用の一時パスワード」を入力する

<画面イメージ>

アプリ側の処理

以下のように処理を行いアカウントの引継ぎを完了させます。

  • 端末Bで入力された「mailAddress(メールアドレス)」と「temporaryPass(移行用の一時パスワード)」を元にmBaaS上のユーザーを検索します
    • このとき、引継ぎ設定の有無のチェックのために「flag = true」であることも条件として検索します。
  • 検索してヒットしたユーザー(端末Aで使用していたもの)でログインを行います
    • 「password」は検索し開示することは出来ない仕様ですが、「userName」と同じもので設定しているのでログインすることができます
  • ログイン後、端末のUDID(UUID_B)を取得し、「transferId」としてを設定します
    • ログインをすることで書き込みが有効になります
    • このとき、引継ぎ設定完了のため「flag = false」も設定します

これでUUID_AのアカウントにUUID_Bを紐付けることが出来ました!

<アカウントイメージ>

《処理3》移行後:「新しい端末の情報で会員を検索してログインを行う」

ユーザー側の動作

  • 引継ぎ先の端末Bでアプリを起動し、利用開始します
    • 引継ぎ元の端末Aで使用していたアカウントの情報を引き継いでアプリを使用できます

アプリ側の処理

以後、ログインはすべて次の処理を通して行うようになります。

  • 端末のUDIDを取得し、それを元にmBaaS上のユーザーを検索します
  • 検索してヒットしたユーザーのuserNameを取得し、ログインを行います

<アカウントイメージ>

おわりに

mBaaSを使った実現方法としてはこんな感じでいかがでしょうか?
細かい部分はぜひサンプルアプリを作りましたので、ご利用ください!

GitHub 動作環境
SwiftAdvanceLoginApp Xcode ver. 8.2.1
mBaaS iOS SDK Ver. 2.3.4

ただ、このやり方だとAPIリクエスト数の消費がどうしても抑えられなかったんです…
あとはセキュリティ的に大丈夫かな?と思ったり…
まだまだです…orz

もっと効率的で良い方法があれば、ぜひコメントをお待ちしています('▼'*ノシ!!

参考

ニフティクラウド mobile backend NCMB mBaaS nifty NiftyCloud