ユーザー作成

Kii Cloud が提供しているユーザー作成機能のうち、最も基本的な方法はユーザー名などの識別情報とパスワードを組み合わせてユーザーを作成する方法です。ここでは、ユーザー名、メールアドレス、電話番号によってユーザーを作成する方法を示します。

ユーザーの識別

ユーザーの作成ではユーザー名、メールアドレス、電話番号を組み合わせてユーザーを識別できます。

たとえば、以下の方法でユーザーを使用できます。

  1. 登録時にユーザー名 "id123456"、パスワード "123ABC" を指定してユーザーを作成
  2. ログイン時にユーザー名 "id123456"、パスワード "123ABC" を指定して認証し、そのユーザーを使用

ユーザー登録が終わった後や、ログインが成功した後はそのユーザーによるログイン状態となり、後続の処理を行うことができます。ユーザー登録直後に明示的にログインする必要はありません。

Kii Cloud ではユーザー名で KiiUser を識別できるだけでなく、ユーザー名の代わりにメールアドレスや電話番号を指定する方法もサポートします。次の表のとおり、ユーザー名、メールアドレス、電話番号のすべての組み合わせを使ってユーザーを登録できます。

ユーザー登録で指定する情報 ログインで入力する情報
ユーザー名 メールアドレス 電話番号 パスワード ユーザー名として指定できる情報 パスワード
指定 - - 必要 ユーザー名 必要
指定 - 指定 必要 ユーザー名または電話番号 必要
指定 指定 - 必要 ユーザー名またはメールアドレス 必要
指定 指定 指定 必要 ユーザー名、メールアドレスまたは電話番号 必要
- - 指定 ※1 必要 電話番号 必要
- 指定 ※2 - 必要 メールアドレス 必要
- 指定 ※3 指定 ※3 必要 メールアドレスまたは電話番号 必要

※1 電話番号による認証がオンのときはユーザー登録できず、エラーになります。
※2 メールアドレスによる認証がオンのときはユーザー登録できず、エラーになります。
※3 電話番号とメールアドレスの認証が両方同時にオンのときはユーザー登録できず、エラーになります。

たとえば、ユーザー名 "id123456"、メールアドレス "user@mydomain.com"、パスワード "123ABC" でユーザー登録した場合、このユーザーは次の 2 通りの方法でログインできます。

  • ユーザー名 "id123456"、パスワード "123ABC"
  • ユーザー名 "user@mydomain.com"、パスワード "123ABC"

登録したメールアドレスや電話番号を、ログイン操作でユーザー名の代わりに指定できる点が重要です(ログイン UI で同じフィールドを使用するイメージ)。登録したメールアドレスや電話番号をログインの認証用に使用したくない場合は、カスタムの ユーザー属性 を使用するか、ユーザースコープの Bucket にこれらの情報を格納するようにします。

ログインではユーザー名、およびユーザー名の代わりにメールアドレスおよび国際電話番号形式の電話番号を、同じ API で指定できます(国内電話番号形式を使用する場合は別 API です)。この 3 つは、「@」を含むとメールアドレス、「+」を含むと電話番号、それ以外はユーザー名として識別されるため、これら 3 つが混在する入力でもアプリケーションを通して一意のユーザーを識別できます。

ユーザー名以外はユーザー登録後に変更することができますが、ユーザー名を変更する方法は提供されていません。

なお、メールアドレスや電話番号は認証機能によって実際に使用できるものであることを確認する機能も用意しています(メールアドレスと電話番号の認証)。この場合、これらの認証が完了した後にログインできるようになります。

ユーザー作成

ユーザー作成の例を以下に挙げます。この例では、新しいユーザーのアカウントを、ユーザー名 user_123456、メールアドレス user_123456@example.com、電話番号 +819012345678、パスワード 123ABC を指定して作成しています。

  • // Create a KiiUser builder.
    KiiUser.Builder builder = KiiUser.builderWithName("user_123456");
    builder.setEmail("user_123456@example.com");
    builder.setGlobalPhone("+819012345678");
    
    // Create a user.
    KiiUser user = builder.build();
    
    try {
      // Register the user.
      user.register("123ABC");
    } catch (AppException e) {
      // Handle the error.
    } catch (IOException e) {
      // Handle the error.
    }
  • // Create a KiiUser builder.
    KiiUser.Builder builder = KiiUser.builderWithName("user_123456");
    builder.setEmail("user_123456@example.com");
    builder.setGlobalPhone("+819012345678");
    
    // Create a user.
    KiiUser user = builder.build();
    
    // Register the user.
    user.register(new KiiUserCallBack() {
      @Override
      public void onRegisterCompleted(int token, KiiUser user, Exception exception) {
        if (exception != null) {
          // Handle the error.
          return;
        }
      }
    }, "123ABC");

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

  1. KiiUser インスタンスを生成します。
    • ユーザー名を指定して builderWithName メソッドを実行し、KiiUser インスタンスビルダーを作成します。
    • (必要に応じて)メールアドレスと電話番号を、それぞれ setEmail メソッドと setGlobalPhone メソッドを使ってセットします。
    • build メソッドを実行し、KiiUser インスタンスを作成します。
  2. パスワードを指定して register メソッドを実行し、ユーザーを登録します。指定したユーザー名とパスワードにより新たなアカウントが作成され、これらによるログイン処理が行われます。

登録しようとしたユーザーと同名のユーザーがすでに登録されていた場合、ConflictException で通知します。例外をアプリで制御する方法は 例外の型 をご覧ください。

ユーザー名を省略したユーザー作成

ユーザー名を省略して新たなアカウントを作成することもできます。メールアドレスや電話番号でアカウント作成を行う場合は、それぞれ builderWithEmail メソッドと builderWithPhone メソッドを利用して KiiUser インスタンスビルダーを作成してください。この際、メールアドレスや電話番号の認証はオフにしておく必要があります(認証処理の詳細については次のセクションを参照してください)。

さらに、ショートカットとして createWithEmail メソッドと createWithPhone メソッドが用意されています。{ユーザー名、メールアドレス、パスワード}の組や{ユーザー名、電話番号、パスワード}の組で新規ユーザー作成を行う場合は、これらのメソッドを利用することで直接 KiiUser インスタンスを作成できます(詳細については Javadoc を参照してください)。

国内電話番号形式利用時の注意

国際電話番号形式ではなく国内電話番号形式を利用する場合は、以下の例のように 2 文字の国コードを指定して setCountry メソッドを利用してください。

  • String phoneNumber = "09051903944";
    String country = "JP";
    String password = "123456";
    
    // Create a user.
    KiiUser user = KiiUser.builderWithPhone(phoneNumber).build();
    
    // Set the two-letter country code.
    user.setCountry(country);
    
    try {
      // Register the user.
      user.register(password);
    } catch (AppException e) {
      // Handle the error.
    } catch (IOException e) {
      // Handle the error.
    }
  • String phoneNumber = "09051903944";
    String country = "JP";
    String password = "123456";
    
    // Create a user.
    KiiUser user = KiiUser.builderWithPhone(phoneNumber).build();
    
    // Set the two-letter country code.
    user.setCountry(country);
    
    // Register the user.
    user.register(new KiiUserCallBack() {
      @Override
      public void onRegisterCompleted(int token, KiiUser user, Exception exception) {
        if (exception != null) {
          // Handle the error.
          return;
        }
      }
    }, password);

ユーザー指定方法を自動判定させる場合

ユーザー作成の際、1 つの入力フィールドで複数種類の識別子を扱いたいような場合、KiiUser.builderWithIdentifier(String) を利用できます。ユーザー名、電話番号、メールアドレスのどれか 1 つをメソッドに指定すると、内部で入力された情報を適切に判断し、新しいユーザーを作成できます。

  • // Create a KiiUser builder.
    KiiUser.Builder builder = null;
    
    try {
      String identifier = "09012345678";
    
      // Set the indentifier to the KiiUser builder.
      builder = KiiUser.builderWithIdentifier(identifier);
    } catch (IllegalArgumentException e) {
      // Handle the error.
      return;
    }
    
    try {
      // You can set a username, email address, global phone number, and
      // local phone number to a builder with a corresponding setter.
      String username = "user_123456";
      builder.setName(username);
    } catch (IllegalArgumentException e) {
      // Handle the error.
      return;
    }
    
    // Create a user.
    KiiUser user = builder.build();
    
    // If you set a local phone number as an identifier,
    // set a country code to the KiiUser instance.
    try {
      String country = "JP";
      user.setCountry(country);
    } catch (IllegalArgumentException e) {
      // Handle the error.
      return;
    }
    
    try {
      String password = "123ABC";
    
      // Register the user.
      user.register(password);
    } catch (IOException e) {
      // Handle the error.
      return;
    } catch (AppException e) {
      // Handle the error.
      return;
    }
  • // Create a KiiUser builder.
    KiiUser.Builder builder = null;
    
    try {
      String identifier = "09012345678";
    
      // Set the indentifier to the KiiUser builder.
      builder = KiiUser.builderWithIdentifier(identifier);
    } catch (IllegalArgumentException e) {
      // Handle the error.
      return;
    }
    
    try {
      // You can set a username, email address, global phone number, and
      // local phone number to a builder with a corresponding setter.
      String username = "user_123456";
      builder.setName(username);
    } catch (IllegalArgumentException e) {
      // Handle the error.
      return;
    }
    
    // Create a user.
    KiiUser user = builder.build();
    
    // If you set a local phone number as an identifier,
    // set a country code to the KiiUser instance.
    try {
      String country = "JP";
      user.setCountry(country);
    } catch (IllegalArgumentException e) {
      // Handle the error.
      return;
    }
    
    String password = "123ABC";
    
    // Register the user.
    user.register(new KiiUserCallBack() {
      @Override
      public void onRegisterCompleted(int token, KiiUser user, Exception exception) {
        if (exception != null) {
          // Handle the error.
          return;
        }
      }
    }, password);

KiiUser.Builder.builderWithIdentifier(String) では、電話番号、メールアドレス、ユーザー名のいずれかの識別子を受け取ります。KiiUser.Builder.builderWithIdentifier(String) で識別子を判断し、 KiiUser.Builder.build() で適切な KiiUser インスタンスを作成します。識別子に国内電話番号を設定した場合は、生成した KiiUser インスタンスに 2 文字の国コードを設定してください。

KiiUser.Builder インスタンスの セッターメソッドで各識別子を個別に設定できます。セッターメソッドでは入力の検証を行います。不正な入力に対しては例外を発生させます。検証される内容については 入力値の制限 を参照ください。

入力値の制限

ユーザー関連の入力値には、文字数や文字種の制限があります。

入力値のチェック方法は SDK によって異なるものがあります。ここに示す情報は、SDK の中で最も厳しいチェック方法のため、各 SDK 共通で使用できます。

ユーザー名

英数字と「_」「-」「.」から構成される 3~64 文字の文字列です。

登録時、同じアプリケーション内ですでに使われているユーザー名を指定するとエラーになります。

ユーザー名は、ログイン時のユーザー識別情報として入力するほか、他のユーザーを検索(Kii Cloud SDK for Android の findUserByUserName メソッドなど)する際にも使用します。

ユーザー名の英字部分は小文字に変換して登録されます。

メールアドレス

「ユーザー@ドメイン」というメールアドレスの形式をした文字列です。基本的に、ユーザー部は英数字と「.」「_」「%」「+」「-」、ドメイン部は英数字と「.」から構成される文字列です。

メールアドレスの文字列は、200 文字以内で、"@" が含まれており、かつ、RFC822 に準拠している必要があります。ただし、エラーチェックの詳細はプラットフォームにより多少異なります。

登録時や変更時にアプリケーション内ですでに使われているメールアドレスを指定するとエラーになります。

電話番号

電話番号は以下の 2 通りの方法で指定できます。SDK によっては国際電話番号形式のみがサポートされます。

  • 国際電話番号形式:「+」に続いて、国を表す番号と、国内電話番号を使う電話番号の形式です。「-」や「.」がない、数字のみの文字列 10~15 文字で指定します。たとえば、日本国内の "090-1234-5678" は "+819012345678" で表現されます。

  • 国内電話番号形式:国内で使用される電話番号を使う方法です。国の情報を libphonenumber で定められた英大文字 2 文字で指定します。たとえば Android では、"09012345678" と国情報 "JP" の 2 つをパラメータで指定します。また、REST では "JP-9012345678" のような表現で指定します。

国際電話番号形式と国内電話番号形式は相互に変換可能であり、電話番号 "+819012345678" と "JP-9012345678" で識別される対象は同じユーザーを指します。

登録時や変更時にアプリケーション内ですでに使われている電話番号を指定するとエラーになります。

電話番号として指定できるのはモバイルの電話番号だけで、固定電話などの電話番号を指定すると、エラーになります。電話番号は、サーバー内の専用のライブラリーによってモバイルのものかどうかが判定されます。

パスワード

英数字と記号(Unicode の文字範囲で \u0020~\u007e )を 4~50 文字の範囲で指定できます。

ユーザー一覧機能の実装ヒント

ユーザー一覧の機能が必要な場合、アプリ側での実装が必要となります。Kii Cloud では、現在、作成済みのユーザー一覧を返す API を提供していません(ユーザー 1 件の検索であれば 他ユーザーの属性の読み込み に記載されている方法で実現できる場合があります)。

実装の一例として、アプリケーションスコープの Bucket を使用する案が考えられます。ユーザーの作成と同時に、作成したユーザー ID(または URI)を持った Object を、アプリケーションスコープの Bucket に登録しておきます。ユーザー一覧が必要なタイミングで、この Bucket 内の Object を取得します。ユーザー名などを同時に登録しておけば、これらを使って検索することもできます。

ただし、このままでは、ユーザー数が増加した場合に必ずパフォーマンスの影響が出るため、全ユーザーの取得を避けられるように、機能や実装を調整しておく必要があります。パフォーマンス もご覧ください。

また、アプリケーションスコープの Bucket には全ユーザーがアクセスできるため、メールアドレス等を登録すると、攻撃 に対して脆弱となります。アクセス権 を設定し、さらに サーバー機能拡張による管理者アクセス なども検討する必要があります。