仮ユーザーの仕組み
仮ユーザーは、ユーザー名やパスワードを指定せずに Kii Cloud 上のユーザーを使用する機能です。ユーザー名やパスワードを使ってユーザーを識別する代わりに、仮ユーザーが作成された際の アクセストークン をモバイルアプリ側で保持し続けることでユーザーを識別します。
モバイルアプリからは、ユーザー名やパスワードを指定せず、Kii Cloud 上に「仮ユーザー」の作成要求を出します。仮ユーザーが作成されると、Kii Cloud から、そのユーザーへのアクセストークンが発行されます。
通常のユーザーがユーザー名やパスワードを使ってログインに成功すると、そのユーザーのログイン状態を示すアクセストークンが発行されますが、ここで仮ユーザーの作成機能を使うと、通常のユーザーのログイン成功と同じ効果が得られることになります。
仮ユーザーの作成時に取得したアクセストークンは、デバイスのローカルストレージに保存しておくなどして、ユーザーが不要になるまで保持し続ける必要があります。アクセストークンを失うと、そのユーザーはアクセスできなくなります。再度ログインが必要な場合は、ログインとアクセストークン に示す方法によって、アクセストークンによるログインを行います。
仮ユーザーは、通常のユーザーと同様に Kii Cloud を利用することができますが、唯一、アクセストークンが発行できず、ユーザー作成時に発行済みのアクセストークン以外の方法で再ログインできない点が異なります。仮ユーザーはユーザー名やパスワードを保持していないので、ログイン操作によって新しいアクセストークンを得ることはできません。
なお、仮ユーザーの作成後、ユーザー名/メールアドレス/電話番号などのユーザーの識別情報と、パスワードを登録することによって、通常のユーザーに変更することもできます。別のデバイスにユーザー情報を引き継ぐような機能を実現するには、通常ユーザーに変更後、別のデバイスからログインするような方法を採用できます。
仮ユーザーの作成
仮ユーザー作成の例を以下に挙げます。この例では、新しい仮ユーザーのアカウントを作成して、発行されたアクセストークンをデバイスに保存しています。
Swift:
// Set predefined fields and a custom field.
let userFields = KiiUserFields ()
userFields . displayName = "Player 1"
userFields . locale = LocaleContainer ()
userFields . setObject ( NSNumber ( value : 12000 as Int ), forKey : "HighScore" )
do {
// Register a pseudo user.
let user = try KiiUser . registerAsPseudoUserSynchronous ( with : userFields )
// Save the access token.
// If you want to encrypt the access token, store it in the keychain.
UserDefaults . standard . set ( user . accessToken , forKey : "token" )
} catch ( let error as NSError ){
// Handle the error.
return
}
// Set predefined fields and a custom field.
let userFields = KiiUserFields ()
userFields . displayName = "Player 1"
userFields . locale = LocaleContainer ()
userFields . setObject ( NSNumber ( value : 12000 as Int ), forKey : "HighScore" )
// Register a pseudo user.
KiiUser . registerAsPseudoUser ( with : userFields ) { ( user : KiiUser ?, error : Error ?) -> Void in
if error != nil {
// Handle the error.
return
}
// Save the access token.
// If you want to encrypt the access token, store it in the keychain.
UserDefaults . standard . set ( user !. accessToken , forKey : "token" )
}
Objective-C:
// Set predefined fields and a custom field.
KiiUserFields * userFields = [[ KiiUserFields alloc ] init ];
[ userFields setDisplayName : @"Player 1" ];
[ userFields setLocale : [[ LocaleContainer alloc ] init ]];
[ userFields setObject : @12000 forKey : @"HighScore" ];
NSError * error ;
// Register a pseudo user.
KiiUser * user = [ KiiUser registerAsPseudoUserSynchronousWithUserFields : userFields error : & error ];
if ( error != nil ) {
// Handle the error.
return ;
}
// Save the access token.
// If you want to encrypt the access token, store it in the keychain.
[[ NSUserDefaults standardUserDefaults ] setObject : user . accessToken
forKey : @"token" ];
// Set predefined fields and a custom field.
KiiUserFields * userFields = [[ KiiUserFields alloc ] init ];
[ userFields setDisplayName : @"Player 1" ];
[ userFields setLocale : [[ LocaleContainer alloc ] init ]];
[ userFields setObject : @12000 forKey : @"HighScore" ];
// Register a pseudo user.
[ KiiUser registerAsPseudoUserWithUserFields : userFields block : ^ ( KiiUser * user , NSError * error ) {
if ( error != nil ) {
// Handle the error.
return ;
}
// Save the access token.
// If you want to encrypt the access token, store it in the keychain.
[[ NSUserDefaults standardUserDefaults ] setObject : user . accessToken
forKey : @"token" ];
}];
基本手順は以下のとおりです。
必要に応じてユーザー属性を設定します。
registerAsPseudoUserWithUserFields:block
メソッドを実行し、仮ユーザーを作成、登録します。
新たなアカウントが作成され、ログイン処理が行われます。KiiUser.accessToken
プロパティでアクセストークンを取得してデバイスに保存します。
仮ユーザーの作成後は、ログイン状態となっており、通常のユーザーと同じ操作ができます。
アプリのアンインストールなどでアクセストークンが失われると、下記の方法で再ログインができなくなるため、ユーザーの領域は参照できない状態となります。なお、ディスプレイネームなどで対象のユーザーを識別できれば、ユーザーコンソール から削除することもできます。
仮ユーザーでのログイン
仮ユーザーはユーザー名やパスワードなど認証に必要な情報を保持していないので、必ずアクセストークンによるログインを行います。
Swift:
do {
// Get an access token.
let token = UserDefaults . standard . string ( forKey : "token" ) !
// Authenticate a user with the access token.
let user = try KiiUser . authenticate ( withTokenSynchronous : token )
} catch ( let error as NSError ){
// Handle the error.
return
}
// Get an access token.
let token = UserDefaults . standard . string ( forKey : "token" ) !
// Authenticate a user with the access token.
KiiUser . authenticate ( withToken : token ) { ( user : KiiUser ?, error : Error ?) -> Void in
if error != nil {
// Handle the error.
return
}
}
Objective-C:
// Get an access token.
NSString * token = [[ NSUserDefaults standardUserDefaults ] stringForKey : @"token" ];
NSError * error ;
// Authenticate a user with the access token.
[ KiiUser authenticateWithTokenSynchronous : token andError : & error ];
if ( error != nil ) {
// Handle the error.
return ;
}
// Get an access token.
NSString * token = [[ NSUserDefaults standardUserDefaults ] stringForKey : @"token" ];
// Authenticate a user with the access token.
[ KiiUser authenticateWithToken : token
andBlock : ^ ( KiiUser * user , NSError * error ) {
if ( error != nil ) {
// Handle the error.
return ;
}
}];
通常のユーザーへの変更
作成した仮ユーザーは後からユーザー名、パスワード等を設定して、通常の認証情報を持ったユーザーに変更することができます。
Swift:
// Get the currently logged-in user.
let user = KiiUser . current () !
// If the current user is a pseudo user
if ! user . isPseudoUser {
// Instantiate an IdentityData object.
let builder = KiiIdentityDataBuilder ()
builder . userName = "user_123456"
builder . email = "user_123456@example.com"
builder . phoneNumber = "+819012345678"
let identityData = builder . build () !
// Set a predefined field and a custom field.
let userFields = KiiUserFields ()
userFields . displayName = "Player 1"
userFields . setObject ( NSNumber ( value : 0 as Int32 ), forKey : "HighScore" )
// Remove a custom field.
userFields . removeFromServer ( forKey : "app_flag" )
do {
// Update the current pseudo user to a normal user.
try user . putIdentityDataSynchronous ( identityData , userFields : nil , password : "123ABC" )
} catch let error as NSError {
// Handle the error.
return
}
}
// Get the currently logged-in user.
let user = KiiUser . current () !
// If the current user is a pseudo user
if ! user . isPseudoUser {
// Instantiate an IdentityData object.
let builder = KiiIdentityDataBuilder ()
builder . userName = "user_123456"
builder . email = "user_123456@example.com"
builder . phoneNumber = "+819012345678"
let identityData = builder . build () !
// Set a predefined field and a custom field.
let userFields = KiiUserFields ()
userFields . displayName = "Player 1"
userFields . setObject ( NSNumber ( value : 0 as Int32 ), forKey : "HighScore" )
// Remove a custom field.
userFields . removeFromServer ( forKey : "app_flag" )
// Update the current pseudo user to a normal user.
user . put ( identityData , userFields : nil , password : "123ABC" ) { ( user : KiiUser ?, error : Error ?) -> Void in
if error != nil {
// Handle the error.
return
}
}
}
Objective-C:
// Get the currently logged-in user.
KiiUser * currentUser = [ KiiUser currentUser ];
// If the current user is a pseudo user
if ( currentUser . isPseudoUser != NO ) {
// Instantiate an IdentityData object.
KiiIdentityDataBuilder * builder = [[ KiiIdentityDataBuilder alloc ] init ];
builder . userName = @"user_123456" ;
builder . email = @"user_123456@example.com" ;
builder . phoneNumber = @"+819012345678" ;
KiiIdentityData * identityData = [ builder build ];
// Set a predefined field and a custom field.
KiiUserFields * userFields = [[ KiiUserFields alloc ] init ];
[ userFields setDisplayName : @"Player 1" ];
[ userFields setObject :[ NSNumber numberWithInt : 0 ] forKey : @"HighScore" ];
// Remove a custom field.
[ userFields removeFromServerForKey : @"app_flag" ];
NSError * error ;
// Update the current pseudo user to a normal user.
[ currentUser putIdentityDataSynchronous : identityData userFields : nil password : @"123ABC" error :& error ];
if ( error != nil ) {
// Handle the error.
return ;
}
}
// Get the currently logged-in user.
KiiUser * currentUser = [ KiiUser currentUser ];
// If the current user is a pseudo user
if ( currentUser . isPseudoUser != NO ) {
// Instantiate an IdentityData object.
KiiIdentityDataBuilder * builder = [[ KiiIdentityDataBuilder alloc ] init ];
builder . userName = @"user_123456" ;
builder . email = @"user_123456@example.com" ;
builder . phoneNumber = @"+819012345678" ;
KiiIdentityData * identityData = [ builder build ];
// Set a predefined field and a custom field.
KiiUserFields * userFields = [[ KiiUserFields alloc ] init ];
[ userFields setDisplayName : @"Player 1" ];
[ userFields setObject :[ NSNumber numberWithInt : 0 ] forKey : @"HighScore" ];
// Remove a custom field.
[ userFields removeFromServerForKey : @"app_flag" ];
// Update the current pseudo user to a normal user.
[ currentUser putIdentityData : identityData userFields : nil password : @"123ABC" block :^ ( KiiUser * user , NSError * error ) {
if ( error != nil ) {
// Handle the error.
return ;
}
}];
}
基本手順は以下のとおりです。
[KiiUser currentUser].isPseudoUser
プロパティを確認してログイン中のユーザーが仮ユーザーか確認します。
KiiIdentityDataBuilder
インスタンスを生成します。
KiiIdentityDataBuilder
にユーザー名、メールアドレス、電話番号を設定して build
メソッドを実行し、 KiiIdentityData
のインスタンスを生成します。
KiiIdentityData
とパスワードを設定して putIdentityData:userFields:password:block
メソッドを実行します。
上記のステップにより、仮ユーザーは通常のユーザーに変更され、認証情報を使ったログイン処理によりアクセストークンを取得できるようになります。
明示的なログインを行わない利用
仮ユーザーを使用する方法以外にも、明示的なログインを行わずに Kii Cloud を使用する方法として以下のものがあります。これらは実装が煩雑になったり、機能制限を受けたりするため、通常は仮ユーザーの使用をおすすめします。
モバイルアプリ側で認証情報を生成する方法
ユーザーにログイン操作をさせたくない場合、初回起動時にモバイルアプリのバックグラウンドでランダムなユーザー名とパスワードを自動生成し、それらを使ってユーザー登録とログインを行う方法が考えられます。生成した情報は、デバイスのストレージに保存しておきます(Android の SharedPreference や、iOS の NSUserDefaults など)。モバイルアプリがアンインストールされるか、OS の設定などでデータの削除が行われるまでは、そのデバイスでそのユーザーが使用できます。
このとき、ユーザー名は重複しないように、モバイルアプリ側で一意のものを生成するための工夫が必要です。
なお、この方法では、デバイスのストレージからユーザー名とパスワードが失われると、Kii Cloud のデータにアクセスできなくなります。ユーザー名とパスワードとして、デバイス ID のようにデバイス単位で不変な情報を使う方法も考えられますが、最近ではプライバシーの観点からデバイス ID の利用は制限される傾向にあります。
別のデバイスに引き継いだり、ログイン情報をバックアップしたりするためには、ストレージに保存しているユーザー名とパスワードのインポートとエクスポート(またはそれらの表示と入力など)のような機能を作り込むことになるはずです。
匿名ユーザー機能を使用する方法
Kii Cloud ではログイン前の匿名ユーザーの状態もサポートしますが、実行できる処理は限られています。ユーザースコープのデータのアクセスをはじめ、ほとんどの機能を利用するには Kii Cloud へのログイン(仮ユーザーの登録も含む)が必要です。