ユーザー作成

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 つが混在する入力でもアプリケーションを通して一意のユーザーを識別できます。

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

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

ユーザー作成

KiiUser のファクトリメソッドによる作成

ユーザー名とパスワードを使ったユーザー作成の例です。この例では、ユーザー名 "user_123456"、パスワード "123ABC" で新規ユーザーの作成を行っています。

Swift:

  • let username = "user_123456"
    let password = "123ABC"
    
    // Create a user.
    let user = KiiUser(username: username, andPassword: password)
    
    do{
      // Register the user.
      try user.performRegistrationSynchronous()
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • let username = "user_123456"
    let password = "123ABC"
    
    // Create a user.
    let user = KiiUser(username: username, andPassword: password)
    
    // Register the user.
    user.performRegistration { (user :KiiUser?, error : Error?) -> Void in
      if (error != nil) {
        // Handle the error.
        return
      }
    }

Objective-C:

  • NSString *username = @"user_123456";
    NSString *password = @"123ABC";
    
    // Create a user.
    KiiUser *user = [KiiUser userWithUsername:username andPassword:password];
    
    NSError *error = nil;
    
    // Register the user.
    [user performRegistrationSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
  • NSString *username = @"user_123456";
    NSString *password = @"123ABC";
    
    // Create a user.
    KiiUser *user = [KiiUser userWithUsername:username andPassword:password];
    
    // Register the user.
    [user performRegistrationWithBlock:^(KiiUser *user, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    }];


次の例では、ユーザー名 "user_123456"、メールアドレス "user_123456@example.com"、パスワード "123ABC" で新規ユーザーの作成を行っています。

Swift:

  • let username = "user_123456"
    let password = "123ABC"
    let email = "user_123456@example.com"
    
    // Create a user.
    let user = KiiUser(username: username, andEmailAddress: email, andPassword: password)
    
    do{
      // Register the user.
      try user.performRegistrationSynchronous()
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • let username = "user_123456"
    let password = "123ABC"
    let email = "user_123456@example.com"
    
    // Create a user.
    let user = KiiUser(username: username, andEmailAddress: email, andPassword: password)
    
    // Register the user.
    user.performRegistration { (user :KiiUser?, error : Error?) -> Void in
      if (error != nil) {
        // Handle the error.
        return
      }
    }

Objective-C:

  • NSString *username = @"user_123456";
    NSString *password = @"123ABC";
    NSString *email = @"user_123456@example.com";
    
    NSError *error;
    
    // Create a user.
    KiiUser *user = [KiiUser userWithUsername:username
                              andEmailAddress:email
                                  andPassword:password];
    
    // Register the user.
    [user performRegistrationSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
  • NSString *username = @"user_123456";
    NSString *password = @"123ABC";
    NSString *email = @"user_123456@example.com";
    
    // Create a user.
    KiiUser *user = [KiiUser userWithUsername:username
                              andEmailAddress:email
                                  andPassword:password];
    
    // Register the user.
    [user performRegistrationWithBlock:^(KiiUser *user, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    }];


次の例では、ユーザー名 "user_123456"、電話番号 "+819012345678"、パスワード "123ABC" で新規ユーザーの作成を行っています。

Swift:

  • let username = "user_123456"
    let password = "123ABC"
    let phoneNumber = "+819012345678"
    
    // Create a user.
    let user = KiiUser(username: username, andPhoneNumber: phoneNumber, andPassword: password)
    user.country = "JP"
    
    do{
      // Register the user.
      try user.performRegistrationSynchronous()
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • let username = "user_123456"
    let password = "123ABC"
    let phoneNumber = "+819012345678"
    
    // Create a user.
    let user = KiiUser(username: username, andPhoneNumber: phoneNumber, andPassword: password)
    user.country = "JP"
    
    // Register the user.
    user.performRegistration { (user :KiiUser?, error : Error?) -> Void in
      if (error != nil) {
        // Handle the error.
        return
      }
    }

Objective-C:

  • NSString *username = @"user_123456";
    NSString *password = @"123ABC";
    NSString *phoneNumber = @"+819012345678";
    
    NSError *error;
    
    // Create a user.
    KiiUser *user = [KiiUser userWithUsername:username
                               andPhoneNumber:phoneNumber
                                  andPassword:password];
    [user setCountry:@"JP"];
    
    // Register the user.
    [user performRegistrationSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
  • NSString *username = @"user_123456";
    NSString *password = @"123ABC";
    NSString *phoneNumber = @"+819012345678";
    
    // Create a user.
    KiiUser *user = [KiiUser userWithUsername:username
                               andPhoneNumber:phoneNumber
                                  andPassword:password];
    [user setCountry:@"JP"];
    
    // Register the user.
    [user performRegistrationWithBlock:^(KiiUser *user, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    }];


次のように、ユーザー名を省略してアカウントを作成することもできます。

メールアドレスとパスワードの組でユーザー作成する例:

Swift:

  • let password = "123ABC"
    let email = "user_123456@example.com"
    
    // Create a user.
    let user = KiiUser(emailAddress: email, andPassword: password)
    
    do{
      // Register the user.
      try user.performRegistrationSynchronous()
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • let password = "123ABC"
    let email = "user_123456@example.com"
    
    // Create a user.
    let user = KiiUser(emailAddress: email, andPassword: password)
    
    // Register the user.
    user.performRegistration { (user :KiiUser?, error : Error?) -> Void in
      if (error != nil) {
        // Handle the error.
        return
      }
    }

Objective-C:

  • NSString *password = @"123ABC";
    NSString *email = @"user_123456@example.com";
    
    NSError *error;
    
    // Create a user.
    KiiUser *user = [KiiUser userWithEmailAddress:email
                                      andPassword:password];
    
    // Register the user.
    [user performRegistrationSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
  • NSString *password = @"123ABC";
    NSString *email = @"user_123456@example.com";
    
    // Create a user.
    KiiUser *user = [KiiUser userWithEmailAddress:email
                                      andPassword:password];
    
    // Register the user.
    [user performRegistrationWithBlock:^(KiiUser *user, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    }];


電話番号とパスワードの組でユーザー作成する例:

Swift:

  • let password = "123ABC"
    let phoneNumber = "+819012345678"
    
    // Create a user.
    let user = KiiUser(phoneNumber: phoneNumber, andPassword: password)
    
    do{
      // Register the user.
      try user.performRegistrationSynchronous()
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • let password = "123ABC"
    let phoneNumber = "+819012345678"
    
    // Create a user.
    let user = KiiUser(phoneNumber: phoneNumber, andPassword: password)
    
    // Register the user.
    user.performRegistration { (user :KiiUser?, error : Error?) -> Void in
      if (error != nil) {
        // Handle the error.
        return
      }
    }

Objective-C:

  • NSString *password = @"123ABC";
    NSString *phoneNumber = @"+819012345678";
    
    NSError *error;
    
    // Create a user.
    KiiUser *user = [KiiUser userWithPhoneNumber:phoneNumber
                                     andPassword:password];
    
    // Register the user.
    [user performRegistrationSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
  • NSString *password = @"123ABC";
    NSString *phoneNumber = @"+819012345678";
    
    // Create a user.
    KiiUser *user = [KiiUser userWithPhoneNumber:phoneNumber
                                     andPassword:password];
    
    // Register the user.
    [user performRegistrationWithBlock:^(KiiUser *user, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    }];

これらのケースの場合、メールアドレスや電話番号の認証をオフにしておく必要があります(認証処理の詳細については次のセクションを参照してください)。

さらに{ユーザー名、メールアドレス、電話番号、パスワード}の組や{メールアドレス、電話番号、パスワード} の組でのユーザー作成も可能です。詳細については appledoc を参照してください。

いずれのケースでも、登録しようとしたユーザーと同名のユーザーがすでに登録されていた場合、NSError の code プロパティが 503 を返します。エラーをアプリで制御する方法は 詳細情報の取得 をご覧ください。

KiiUserBuilder による作成

KiiUser クラスのファクトリメソッドを利用する方法の他に、 KiiUserBuilder インスタンスを利用して KiiUser インスタンスを作成する方法もあります。ここでは builderWithIdentifier:password を使った例を説明します。

Swift:

  • let identifier = "09012345678"
    let password = "123ABC"
    
    // Create a KiiUser builder.
    let builder = KiiUserBuilder(identifier: identifier, password: password)
    if (builder == nil) {
      // Handle the error.
      return
    }
    
    // You can set a username, email address, global phone number, and
    // local phone number to a builder with a corresponding setter.
    let username = "user_123456";
    builder!.setUsername(username)
    
    // Create a user.
    let user = builder!.build()
    
    // If you set a local phone number as an identifier,
    // set a country code to the KiiUser instance.
    let country = "JP"
    user.country = country
    
    do{
      // Register the user.
      try user.performRegistrationSynchronous()
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • let identifier = "09012345678"
    let password = "123ABC"
    
    // Create a KiiUser builder.
    let builder = KiiUserBuilder(identifier: identifier, password: password)
    if (builder == nil) {
      // Handle the error.
      return
    }
    
    // You can set a username, email address, global phone number, and
    // local phone number to a builder with a corresponding setter.
    let username = "user_123456";
    builder!.setUsername(username)
    
    // Create a user.
    let user = builder!.build()
    
    // If you set a local phone number as an identifier,
    // set a country code to the KiiUser instance.
    let country = "JP"
    user.country = country
    
    // Register the user.
    user.performRegistration { (user: KiiUser?, error: Error?) -> Void in
      if (error != nil) {
        // Handle the error.
        return
      }
    }

Objective-C:

  • NSString *identifier = @"09012345678";
    NSString *password = @"123ABC";
    
    // Create a KiiUser builder.
    KiiUserBuilder *builder =
      [KiiUserBuilder builderWithIdentifier:identifier
                                   password:password];
    if (builder == nil) {
      // Handle the error.
      return;
    }
    
    // You can set a username, email address, global phone number, and
    // local phone number to a builder with a corresponding setter.
    NSString *username = @"user_123456";
    [builder setUsername:username];
    
    // 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.
    NSString *country = @"JP";
    user.country = country;
    
    NSError *error = nil;
    
    // Register the user.
    [user performRegistrationSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
  • NSString *identifier = @"09012345678";
    NSString *password = @"123ABC";
    
    // Create a KiiUser builder.
    KiiUserBuilder *builder =
      [KiiUserBuilder builderWithIdentifier:identifier
                                   password:password];
    if (builder == nil) {
      // Handle the error.
      return;
    }
    
    // You can set a username, email address, global phone number, and
    // local phone number to a builder with a corresponding setter.
    NSString *username = @"user_123456";
    [builder setUsername:username];
    
    // 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.
    NSString *country = @"JP";
    user.country = country;
    
    // Register the user.
    [user performRegistrationWithBlock:^(KiiUser* user, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    }];

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

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

入力値の制限

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

入力値のチェック方法は 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 は全ユーザーからアクセスできるため、メールアドレス等を登録すると、攻撃 に対して脆弱となります。アクセス権 を設定し、さらに サーバー機能拡張による管理者アクセス なども検討する必要があります。