仮ユーザー(Pseudo User)

Kii Cloud が提供するユーザー管理やデータ管理機能をフルで活用したいが、ユーザー名やパスワードによるアカウント登録をユーザーに強いたくない場合があります。このような要望を満たすため Kii Cloud では「仮ユーザー」の機能を提供しています。

仮ユーザーの仕組み

仮ユーザーは、ユーザー名やパスワードを指定せずに Kii Cloud 上のユーザーを使用する機能です。ユーザー名やパスワードを使ってユーザーを識別する代わりに、仮ユーザーが作成された際の アクセストークン をモバイルアプリ側で保持し続けることでユーザーを識別します。

モバイルアプリからは、ユーザー名やパスワードを指定せず、Kii Cloud 上に「仮ユーザー」の作成要求を出します。仮ユーザーが作成されると、Kii Cloud から、そのユーザーへのアクセストークンが発行されます。

通常のユーザーがユーザー名やパスワードを使ってログインに成功すると、そのユーザーのログイン状態を示すアクセストークンが発行されますが、ここで仮ユーザーの作成機能を使うと、通常のユーザーのログイン成功と同じ効果が得られることになります。

仮ユーザーの作成時に取得したアクセストークンは、デバイスのローカルストレージに保存しておくなどして、ユーザーが不要になるまで保持し続ける必要があります。アクセストークンを失うと、そのユーザーはアクセスできなくなります。再度ログインが必要な場合は、ログインとアクセストークン に示す方法によって、アクセストークンによるログインを行います。

仮ユーザーは、通常のユーザーと同様に Kii Cloud を利用することができますが、唯一、アクセストークンが発行できず、ユーザー作成時に発行済みのアクセストークン以外の方法で再ログインできない点が異なります。仮ユーザーはユーザー名やパスワードを保持していないので、ログイン操作によって新しいアクセストークンを得ることはできません。

なお、仮ユーザーの作成後、ユーザー名/メールアドレス/電話番号などのユーザーの識別情報と、パスワードを登録することによって、通常のユーザーに変更することもできます。別のデバイスにユーザー情報を引き継ぐような機能を実現するには、通常ユーザーに変更後、別のデバイスからログインするような方法を採用できます。

仮ユーザーの作成

仮ユーザー作成の例を以下に挙げます。この例では、新しい仮ユーザーのアカウントを作成して、発行されたアクセストークンをデバイスに保存しています。

  • try {
      // Set predefined fields and a custom field.
      UserFields userFields = new UserFields();
      userFields.putDisplayName("Player 1");
      userFields.putLocale(new LocaleContainer(Locale.getDefault()));
      userFields.set("HighScore", 0);
    
      // Register a pseudo user.
      KiiUser pseudoUser = KiiUser.registerAsPseudoUser(userFields);
    
      // Save the access token.
      String accessToken = pseudoUser.getAccessToken();
    
      // Store the access token in the storage with your own function.
      storeToken(accessToken);
    } catch (IOException e) {
      // Handle the error.
    } catch (AppException e) {
      // Handle the error.
    }
  • // Set predefined fields and a custom field.
    UserFields userFields = new UserFields();
    userFields.putDisplayName("Player 1");
    userFields.putLocale(new LocaleContainer(Locale.getDefault()));
    userFields.set("HighScore", 0);
    
    // Register a pseudo user.
    KiiUser.registerAsPseudoUser(userFields, new KiiUserRegisterCallback() {
      @Override
      public void onRegisterCompleted(KiiUser kiiUser, Exception exception) {
        if (exception != null) {
          // Handle the error.
          return;
        }
        // Save the access token.
        String accessToken = kiiUser.getAccessToken();
    
        // Store the access token in the storage with your own function.
        storeToken(accessToken);
      }
    });

基本手順は以下のとおりです。

  1. 必要に応じてユーザー属性を作成します。
  2. registerAsPseudoUser メソッドを実行し、仮ユーザーを作成、登録します。
  3. 新たなアカウントが作成され、ログイン処理が行われます。KiiUser.getAccessToken メソッドでアクセストークンを取得してデバイスに保存します。

仮ユーザーの作成後は、ログイン状態となっており、通常のユーザーと同じ操作ができます。

アプリのアンインストールなどでアクセストークンが失われると、下記の方法で再ログインができなくなるため、ユーザーの領域は参照できない状態となります。なお、ディスプレイネームなどで対象のユーザーを識別できれば、ユーザーコンソール から削除することもできます。

仮ユーザーでのログイン

仮ユーザーはユーザー名やパスワードなど認証に必要な情報を保持していないので、必ずアクセストークンによるログインを行います。

  • // Get an access token from the storage with your own function.
    String accessToken = getStoredToken();
    
    // Authenticate a user with the access token.
    try {
      KiiUser.loginWithToken(accessToken);
    } catch (IOException e) {
      // Handle the error.
    } catch (AppException e) {
      // Handle the error.
    }
  • // Get an access token from the storage with your own function.
    String accessToken = getStoredToken();
    
    // Authenticate a user with the access token.
    KiiUser.loginWithToken(new KiiUserCallBack() {
      @Override
      public void onLoginCompleted(int token, KiiUser user, Exception exception) {
        if (exception != null) {
          // Handle the error.
          return;
        }
      }
    }, accessToken);

通常のユーザーへの変更

作成した仮ユーザーは後からユーザー名、パスワード等を設定して、通常の認証情報を持ったユーザーに変更することができます。

  • // If the currently logged-in user is a pseudo user
    if (KiiUser.getCurrentUser().isPseudoUser()) {
      // Get the currently logged-in user.
      KiiUser pseudoUser = KiiUser.getCurrentUser();
    
      try {
        // Instantiate an IdentityData object.
        IdentityData.Builder builder =
          IdentityData.Builder.newWithName("user_123456");
        builder.withEmail("user_123456@example.com")
          .withPhone("+819012345678");
        IdentityData identityData = builder.build();
    
        // Set a predefined field and a custom field.
        UserFields userFields = new UserFields();
        userFields.putDisplayName("Player 1");
        userFields.set("HighScore", 0);
    
        // Remove a custom field.
        userFields.removeFromServer("app_flag");
    
        // Update the current pseudo user to a normal user.
        pseudoUser.putIdentity(identityData, userFields, "123ABC");
      } catch (AlreadyHasIdentityException e) {
        // The current user already has identity information. You can use this user as a named user.
      } catch (IOException e) {
        // Handle the error.
      } catch (AppException e) {
        // Handle the error.
      }
    }
  • // If the currently logged-in user is a pseudo user
    if (KiiUser.getCurrentUser().isPseudoUser()) {
      // Get the currently logged-in user.
      KiiUser pseudoUser = KiiUser.getCurrentUser();
    
      // Instantiate an IdentityData object.
      IdentityData.Builder builder =
        IdentityData.Builder.newWithName("user_123456");
      builder.withEmail("user_123456@example.com")
        .withPhone("+819012345678");
      IdentityData identityData = builder.build();
    
      // Set a predefined field and a custom field.
      UserFields userFields = new UserFields();
      userFields.putDisplayName("Player 1");
      userFields.set("HighScore", 0);
    
      // Remove a custom field.
      userFields.removeFromServer("app_flag");
    
      // Update the current pseudo user to a normal user.
      pseudoUser.putIdentity(identityData, userFields, "123ABC",new KiiUserPutIdentityCallback() {
        @Override
        public void onPutIdentityCompleted(KiiUser kiiUser, Exception exception) {
          if (exception != null) {
            // Handle the error.
            return;
          }
        }
      });
    }

基本手順は以下のとおりです。

  1. KiiUser.getCurrentUser().isPseudoUser() メソッドを実行してログイン中のユーザーが仮ユーザーか確認します。
  2. ユーザー名を指定して、IdentityData.Builder インスタンスを生成します。
  3. IdentityData.Builder にメールアドレス、電話番号を設定します。
  4. IdentityData.Builder.build メソッドを実行し、IdentityData のインスタンスを生成します。
  5. UserFields のインスタンスを生成して、必要に応じてユーザー属性を設定します。
  6. IdentityDataUserFields とパスワードを設定して KiiUser.putIdentity メソッドを実行します。

上記のステップにより、仮ユーザーは通常のユーザーに変更され、認証情報を使ったログイン処理によりアクセストークンを取得できるようになります。

明示的なログインを行わない利用

仮ユーザーを使用する方法以外にも、明示的なログインを行わずに Kii Cloud を使用する方法として以下のものがあります。これらは実装が煩雑になったり、機能制限を受けたりするため、通常は仮ユーザーの使用をおすすめします。

モバイルアプリ側で認証情報を生成する方法

ユーザーにログイン操作をさせたくない場合、初回起動時にモバイルアプリのバックグラウンドでランダムなユーザー名とパスワードを自動生成し、それらを使ってユーザー登録とログインを行う方法が考えられます。生成した情報は、デバイスのストレージに保存しておきます(Android の SharedPreference や、iOS の NSUserDefaults など)。モバイルアプリがアンインストールされるか、OS の設定などでデータの削除が行われるまでは、そのデバイスでそのユーザーが使用できます。

このとき、ユーザー名は重複しないように、モバイルアプリ側で一意のものを生成するための工夫が必要です。

なお、この方法では、デバイスのストレージからユーザー名とパスワードが失われると、Kii Cloud のデータにアクセスできなくなります。ユーザー名とパスワードとして、デバイス ID のようにデバイス単位で不変な情報を使う方法も考えられますが、最近ではプライバシーの観点からデバイス ID の利用は制限される傾向にあります。

別のデバイスに引き継いだり、ログイン情報をバックアップしたりするためには、ストレージに保存しているユーザー名とパスワードのインポートとエクスポート(またはそれらの表示と入力など)のような機能を作り込むことになるはずです。

匿名ユーザー機能を使用する方法

Kii Cloud ではログイン前の匿名ユーザーの状態もサポートしますが、実行できる処理は限られています。ユーザースコープのデータのアクセスをはじめ、ほとんどの機能を利用するには Kii Cloud へのログイン(仮ユーザーの登録も含む)が必要です。