ユーザー作成

ユーザー名とパスワードによるユーザー作成の代わりに、Facebook などの外部サービス経由でユーザー作成を行うことも可能です。詳細は 別サービスアカウントを利用した認証 を参照してください。

アプリケーションのユーザー管理の第一歩は、ユーザー作成です。ユーザーの作成では次のような機能を提供しています。

  • ユーザー名とパスワードによって KiiUser を作成できます。

  • メールアドレスや電話番号をユーザー作成時に指定し、これらの情報をユーザーに紐付けることができます。

  • メールアドレスや電話番号の認証処理を行わせることができます。

ユーザー作成の機能概要については ユーザー登録とログイン をご覧ください。

ユーザー作成

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

  • KiiUser.Builder builder = KiiUser.builderWithName("user_123456");
    builder.setEmail("user_123456@example.com");
    builder.setGlobalPhone("+819012345678");
    KiiUser user = builder.build();
    
    try {
      user.register("123ABC");
    } catch (AppException e) {
      // Handle the error.
    } catch (IOException e) {
      // Handle the error.
    }
  • KiiUser.Builder builder = KiiUser.builderWithName("user_123456");
    builder.setEmail("user_123456@example.com");
    builder.setGlobalPhone("+819012345678");
    KiiUser user = builder.build();
    
    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";
    KiiUser user = KiiUser.builderWithPhone(phoneNumber).build();
    user.setCountry(country); // 2-letter country code
    try {
      user.register(password);
    } catch (AppException e) {
      // Handle the error.
    } catch (IOException e) {
      // Handle the error.
    }
  • String phoneNumber = "09051903944";
    String country = "JP";
    String password = "123456";
    KiiUser user = KiiUser.builderWithPhone(phoneNumber).build();
    user.setCountry(country); // 2-letter country code
    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 つをメソッドに指定すると、内部で入力された情報を適切に判断し、新しいユーザーを作成できます。

  • KiiUser.Builder builder = null;
    try {
      String identifier = "09012345678";
      builder = KiiUser.builderWithIdentifier(identifier);
    } catch (IllegalArgumentException e) {
      // Failed to instantiate a KiiUser builder.
      // 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 settter.
      String username = "user_123456";
      builder.setName(username);
    } catch (IllegalArgumentException e) {
      // The username is invalid.
      // Handle the error.
      return;
    }
    
    // Build a KiiUser instance.
    KiiUser user = builder.build();
    
    // If you set a local phone number as an identifier, you need to set
    // a country code to the KiiUser instance.
    try {
      String country = "JP";
      user.setCountry(country);
    } catch (IllegalArgumentException e) {
      // The country code is invalid.
      // Handle the error.
      return;
    }
    
    try {
      String password = "123ABC";
      user.register(password);
    } catch (IOException e) {
      // User registration failed.
      // Handle the error.
      return;
    } catch (AppException e) {
      // User registration failed.
      // Handle the error.
      return;
    }
  • KiiUser.Builder builder = null;
    try {
      String identifier = "09012345678";
      builder = KiiUser.builderWithIdentifier(identifier);
    } catch (IllegalArgumentException e) {
      // Failed to instantiate a KiiUser builder.
      // 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 settter.
      String username = "user_123456";
      builder.setName(username);
    } catch (IllegalArgumentException e) {
      // The username is invalid.
      // Handle the error.
      return;
    }
    
    // Build a KiiUser instance.
    KiiUser user = builder.build();
    
    // If you set a local phone number as an identifier, you need to set
    // a country code to the KiiUser instance.
    try {
      String country = "JP";
      user.setCountry(country);
    } catch (IllegalArgumentException e) {
      // The country code is invalid.
      // Handle the error.
      return;
    }
    
    String password = "123ABC";
    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 インスタンスの セッターメソッドで各識別子を個別に設定できます。セッターメソッドでは入力の検証を行います。不正な入力に対しては例外を発生させます。検証される内容については 入力値の制限 を参照ください。

入力値の制限

ユーザー関連の入力値には、文字数や文字種の制限があります。詳しくは ユーザーを識別する情報 および Javadoc をご覧ください。

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

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

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

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

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

メールアドレス/電話番号の認証

ユーザー作成時にメールアドレスや電話番号が指定された場合、これらが正しいことを認証することができます。メールアドレスや電話番号の認証処理の概要については メールアドレスと電話番号の認証 をご覧ください。

デフォルトでは認証機能はオフになっています。認証機能をオン/オフは、開発者ポータルで設定します。設定方法は 認証機能のオン/オフ をご覧ください。

認証機能を使用する場合、ユーザー登録時に、ユーザー名、メールアドレス、電話番号のうち認証なしで使える情報が最低でも 1 件必要です。メールアドレスの認証をオンにした場合、ユーザー名または認証オフで利用できる電話番号の指定が必要です。電話番号の認証をオンにした場合、ユーザー名または認証オフで利用できるメールアドレスの指定が必要です。両方をオンにした場合、ユーザー名の指定が必要です。

認証をオンにすると、以下の手順で認証を行いつつユーザー作成が行われます。

メールアドレス認証

メールアドレス認証がオンの状態でメールアドレスを伴うアカウント作成処理が実行されると、Kii Cloud はこのメールアドレス宛てに認証リンク付きの確認メールを送信します。指定されたメールアドレスによるログインは、ユーザーがこの認証リンクをクリックするまで有効になりません。Kii Cloud は、認証処理が完了するとメールでその旨をユーザーに通知します。

なお、メールアドレス認証がオンの状態でメールアドレスが変更された場合も、同様に新しいメールアドレスの認証処理が実行されます。新しいメールアドレスによるログインは、送信された確認メール内の認証リンクがクリックされるまで有効になりません。認証が完了するとユーザーにその旨が通知されます(古いメールアドレスは認証処理が完了した時点で無効になります)。認証が完了していない保留中のメールアドレスは KiiUser#getPendingEmail() メソッドで取得できます。

概要 に記載の図もあわせてご確認ください。

リダイレクト URL の設定

リダイレクト URL を設定すると、ユーザーがメール内の認証リンクをクリックした際に表示する Web ページを指定できます。

リダイレクト URL の設定は開発者ポータルで行います。リダイレクト URL の設定 をご覧ください。

メールのカスタマイズ

Kii Cloud が送信する確認メールや認証完了通知メールの送信元や内容(テンプレート)は変更可能です。テンプレートは、ユーザーのロケールごとに設定できます。

メール送信元や内容の変更は開発者ポータルで行います。メールのカスタマイズ をご覧ください。

また、ユーザーのロケールを設定するサンプルコード もご覧ください。

確認メールの再送信

確認メールはユーザーの登録や変更のタイミングで自動的に送信されますが、API によって再送することもできます。

ユーザー名などを使ってログイン状態にしてから、以下のように requestResendEmailVerification メソッドを呼び出します。

  • try {
      // Resend a verification mail.
      KiiUser.requestResendEmailVerification();
    } catch (IOException e) {
      // Handle the error.
    } catch (AppException e) {
      // Handle the error.
    }
  • // Resend a verification mail.
    KiiUser.requestResendEmailVerification(new KiiUserCallBack() {
      @Override
      public void onRequestResendEmailVerificationCodeCompleted(int token, Exception exception) {
        if (exception == null) {
          // Handle the error.
          return;
        }
      }
    });

電話番号(SMS)認証

電話番号(SMS)認証がオンの状態で電話番号を伴うアカウント作成処理が実行されると、Kii Cloud はこの電話番号宛てに認証コードを含む SMS を送信します。認証処理を完了するには、この認証コードをユーザーより受け取り、Kii Cloud に送信する必要があります。指定された電話番号によるログインは、この認証処理が完了するまで有効になりません。

なお、電話番号の認証がオンの状態で電話番号が変更された場合も、同様に新しい電話番号の認証処理が実行されます。新しい電話番号によるログインは、SMS 送信された認証コードを Kii Cloud に送信するまで有効になりません。認証が完了するとユーザーにその旨が通知されます(古い電話番号は認証処理が完了した時点で無効になります)。認証が完了していない保留中の電話番号は KiiUser#getPendingPhone() メソッドで取得できます。

概要 に記載の図もあわせてご確認ください。

注意:電話番号は、+ と、国コードから始まる国際電話番号を指定してください。これにより Kii Cloud で SMS の宛先を決定できるようになります。上記以外の形式が指定された場合、本人認証用 SMS が正しく送信できないことがあります。

電話番号の認証は、以下のように verifyPhone メソッドを実行して認証コードを Kii Cloud に送信することで完了します。

  • String code = "XYZXYZXYZ"; // Verification code
    
    try {
      // Verify the phone number using a code sent via SMS.
      user.verifyPhone(code);
    } catch (IOException e) {
      // Handle the error.
    } catch (AppException e) {
      // Handle the error.
    }
  • String code = "XYZXYZXYZ"; // Verification code
    
    // Verify the phone number using a code sent via SMS.
    user.verifyPhone(new KiiUserCallBack() {
      @Override
      public void onVerifyPhoneCompleted(int token, Exception exception) {
        if (exception != null) {
          // Handle the error.
          return;
        }
      }
    }, code);

SMS テンプレートのカスタマイズ

Kii Cloud が送信する SMS の内容(テンプレート)はカスタマイズ可能です。

SMS テンプレートのカスタマイズは開発者ポータルで行います。電話番号(SMS)認証の設定 をご覧ください。

認証 SMS の再送信

認証リンク付き SMS はユーザーの登録や変更のタイミングで自動的に送信されますが、API によって再送することもできます。

ユーザー名などを使ってログイン状態にしてから、以下のように requestResendPhoneVerificationCode メソッドを呼び出します。

  • try {
      // Resend a verification SMS message.
      KiiUser.requestResendPhoneVerificationCode();
    } catch (IOException e) {
      // Handle the error.
    } catch (AppException e) {
      // Handle the error.
    }
    return null;
  • // Resend a verification SMS message.
    KiiUser.requestResendPhoneVerificationCode(new KiiUserCallBack() {
      @Override
      public void onRequestResendPhoneVerificationCodeCompleted(int token, Exception exception) {
        if (exception == null) {
            // Handle the error.
            return;
        }
      }
    });

メールテンプレートのローカライズ

ユーザー作成時にロケールを設定することで、認証に使用するメールのテンプレートをこのロケール用のものに切り替えることができます。

ユーザーデバイスのロケールは Locale#getDefault() メソッドで取得できます。実際に KiiUser に設定する際には、次のサンプルコードのように LocaleContainer クラスのインスタンスを利用します。LocaleContainer クラスは、各プラットフォームごとに異なるロケールの表現形式をサーバーが認識できる共通のフォーマットに変換するクラスです。

  • String password = "123456";
    
    // Create a KiiUser object.
    KiiUser user = KiiUser.builderWithName("user_123456").build();
    
    // Set the browser locale.
    user.setLocale(new LocaleContainer(Locale.getDefault()));
    try {
      // Register the user.
      user.register(password);
    } catch (AppException e) {
      // Handle the error.
    } catch (IOException e) {
      // Handle the error.
    }
  • String password = "123456";
    
    // Create a KiiUser object.
    KiiUser user = KiiUser.builderWithName("user_123456").build();
    
    // Set the browser locale.
    user.setLocale(new LocaleContainer(Locale.getDefault()));
    
    // 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);