facebook twitter hatena line email

「Unity/Firebase/Authentication」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(メールアドレス認証を使う場合)
 
(同じ利用者による、間の23版が非表示)
行10: 行10:
 
#web側のfirebaseコンソールで匿名認証を有効にする(Authentication/ログイン方法/匿名/有効)
 
#web側のfirebaseコンソールで匿名認証を有効にする(Authentication/ログイン方法/匿名/有効)
  
以下を実装
+
===アカウント作成処理===
 
<pre>
 
<pre>
 
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
 
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
 
auth.SignInAnonymouslyAsync().ContinueWith(task => {
 
auth.SignInAnonymouslyAsync().ContinueWith(task => {
 +
  // この中はUIスレッドで通る
 +
  // 同じアカウントが既にあってもこの中は通る。
 
   if (task.IsCanceled)
 
   if (task.IsCanceled)
 
   {
 
   {
行26: 行28:
 
   Firebase.Auth.FirebaseUser newUser = task.Result;
 
   Firebase.Auth.FirebaseUser newUser = task.Result;
 
   Debug.Log("User signed in successfully");
 
   Debug.Log("User signed in successfully");
   Debug.Log("user=" + newUser.DisplayName); // 匿名では空だった
+
   Debug.Log("userName=" + newUser.DisplayName); // 匿名では空だった
   Debug.Log("user=" + newUser.UserId); // こちらはX3TUGaMPQPaN1rmGL2CxhQ4z4712と表示
+
   Debug.Log("userId=" + newUser.UserId); // こちらはX3TUGaMPQPaN1rmGL2CxhQ4z4712と表示
});
+
}, TaskScheduler.FromCurrentSynchronizationContext());
 
</pre>
 
</pre>
  
再起動やキャッシュ削除してもUserIdは変わらないが、アプリデータ削除や再インストールではUserIdは変わる。
+
#上の情報は作成処理をするたびに、UserIdは変わる。
  
 
公式:https://firebase.google.com/docs/auth/unity/anonymous-auth?hl=ja
 
公式:https://firebase.google.com/docs/auth/unity/anonymous-auth?hl=ja
 +
 +
===ユーザ情報取得===
 +
<pre>
 +
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
 +
if (user != null) {
 +
  string name = user.DisplayName;
 +
  string email = user.Email;
 +
  System.Uri photo_url = user.PhotoUrl;
 +
  // The user's Id, unique to the Firebase project.
 +
  // Do NOT use this value to authenticate with your backend server, if you
 +
  // have one; use User.TokenAsync() instead.
 +
  string uid = user.UserId;
 +
}
 +
</pre>
 +
#ユーザ情報は、再起動やキャッシュ削除してもUserIdは変わらないが、アプリデータ削除や再インストールではUserIdは変わる。
  
 
==メールアドレス認証を使う場合==
 
==メールアドレス認証を使う場合==
行39: 行56:
 
#"ユーザーがメールアドレスとパスワードを使用してログインできるようにします。"側だけon
 
#"ユーザーがメールアドレスとパスワードを使用してログインできるようにします。"側だけon
  
以下アカウント作成処理
+
===アカウント作成処理===
 
+
<pre>
 
string email = "hogehoge@example.com";
 
string email = "hogehoge@example.com";
 
string password = "hogehoge"; // 6文字以上でないとisFaulted側を通る
 
string password = "hogehoge"; // 6文字以上でないとisFaulted側を通る
行59: 行76:
 
     Debug.LogFormat("Firebase user created successfully: ({0}) ({1})",
 
     Debug.LogFormat("Firebase user created successfully: ({0}) ({1})",
 
                     newUser.DisplayName, newUser.UserId);
 
                     newUser.DisplayName, newUser.UserId);
 +
}, TaskScheduler.FromCurrentSynchronizationContext());
 +
</pre>
 +
アカウントを作成してもメールは飛ばない、アカウントを作成した後、上の処理をすると既に同じアカウントがあるということで、IsFaulted側を通る。
 +
 +
===メール認証のログイン===
 +
<pre>
 +
auth.SignInWithEmailAndPasswordAsync(email, password).ContinueWith(task => {
 +
  // この中はUIが表示できない。
 +
  if (task.IsCanceled) {
 +
    Debug.LogError("SignInWithEmailAndPasswordAsync was canceled.");
 +
    return;
 +
  }
 +
  if (task.IsFaulted) {
 +
    Debug.LogError("SignInWithEmailAndPasswordAsync encountered an error: " + task.Exception);
 +
    return;
 +
  }
 +
 +
  Firebase.Auth.FirebaseUser newUser = task.Result;
 +
  Debug.LogFormat("User signed in successfully: {0} ({1})",
 +
      newUser.DisplayName, newUser.UserId);
 +
}, TaskScheduler.FromCurrentSynchronizationContext());
 +
</pre>
 +
 +
===メール認証のパスワード変更===
 +
firebaseコンソール側から管理者がパスワード変更用のurlをメールすることができる。
 +
 +
===ユーザ情報取得===
 +
<pre>
 +
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
 +
if (user != null) {
 +
  string name = user.DisplayName;
 +
  string email = user.Email;
 +
  System.Uri photo_url = user.PhotoUrl;
 +
  // The user's Id, unique to the Firebase project.
 +
  // Do NOT use this value to authenticate with your backend server, if you
 +
  // have one; use User.TokenAsync() instead.
 +
  string uid = user.UserId;
 +
}
 +
</pre>
 +
公式:https://firebase.google.com/docs/auth/unity/password-auth?hl=ja
 +
 +
==匿名アカウントからメール認証アカウントに移行する==
 +
上記の匿名アカウント作成の後にメール認証アカウントを作成してしまうと、
 +
メールアカウント作成時に別のuserIdが作られてしまうので、
 +
以下のようにAuthCredentialを使ってつなぎこむ必要がある。
 +
 +
公式:https://firebase.google.com/docs/auth/unity/account-linking?hl=ja
 +
 +
以下AuthCredentialの使い方
 +
 +
===まずは匿名アカウントを作る===
 +
<pre>
 +
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
 +
auth.SignInAnonymouslyAsync().ContinueWith(task => {
 +
  // この中はUIスレッドで通る
 +
  // 同じアカウントが既にあってもこの中は通る。
 +
  if (task.IsCanceled)
 +
  {
 +
    Debug.LogError("SignInAnonymouslyAsync was canceled.");
 +
    return;
 +
  }
 +
  if (task.IsFaulted)
 +
  {
 +
    Debug.LogError("SignInAnonymouslyAsync encountered an error: " + task.Exception); // 匿名が有効になって場合はこちらを通る。
 +
    return;
 +
  }
 +
  Firebase.Auth.FirebaseUser newUser = task.Result;
 +
  Debug.Log("User signed in successfully");
 +
  Debug.Log("user=" + newUser.DisplayName); // 匿名では空だった
 +
  Debug.Log("user=" + newUser.UserId); // こちらはX3TUGaMPQPaN1rmGL2CxhQ4z4712と表示
 +
}, TaskScheduler.FromCurrentSynchronizationContext());
 +
</pre>
 +
 +
===メール認証アカウントを匿名アカウントにつなぎこむ===
 +
上記処理の後に、以下処理をする
 +
<pre>
 +
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
 +
string email = "hogehoge@example.com";
 +
string password = "hogehoge"; // 6文字以上でないとisFaulted側を通る
 +
Firebase.Auth.Credential credential = Firebase.Auth.EmailAuthProvider.GetCredential(email, password);
 +
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
 +
if (user == null) {
 +
  Debug.LogError("no user.");
 +
  return;
 +
}
 +
user.LinkWithCredentialAsync(credential).ContinueWith(task => {
 +
  if (task.IsCanceled) {
 +
    Debug.LogError("LinkWithCredentialAsync was canceled.");
 +
    return;
 +
  }
 +
  if (task.IsFaulted) {
 +
    Debug.LogError("LinkWithCredentialAsync encountered an error: " + task.Exception); // 既にemailが登録されてる時はここを通る
 +
    return;
 +
  }
 +
 +
  Firebase.Auth.FirebaseUser newUser = task.Result;
 +
  Debug.LogFormat("Credentials successfully linked to Firebase user: {0} ({1})",
 +
      newUser.DisplayName, newUser.UserId);
 +
}, TaskScheduler.FromCurrentSynchronizationContext());
 +
</pre>
 +
 +
==ログアウト==
 +
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
 +
auth.SignOut();
 +
 +
==戻りコールバック内でUIThreadを処理する==
 +
<pre>
 +
auth.SignInAnonymouslyAsync().ContinueWith(task =>
 +
{
 +
  // callback処理
 
});
 
});
 +
</pre>
  
アカウントを作成してもメールは飛ばない、アカウントを作成した後、上の処理をすると既に同じアカウントがあるということで、IsFaulted側を通る。
+
以下のように第2引数にFromCurrentSynchronizationContextを追加する
 +
<pre>
 +
using System.Threading.Tasks;
 +
auth.SignInAnonymouslyAsync().ContinueWith(task =>
 +
{
 +
  // callback処理
 +
}, TaskScheduler.FromCurrentSynchronizationContext());
 +
</pre>

2019年7月20日 (土) 01:31時点における最新版

Firebase設定

unity/Firebase/基本 [ショートカット]

認証プラグインインストール

FirebaseAuth.unitypackageをAssets/Importからインストールする

https://firebase.google.com/download/unity?hl=ja

匿名認証を使う場合

  1. web側のfirebaseコンソールで匿名認証を有効にする(Authentication/ログイン方法/匿名/有効)

アカウント作成処理

Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
auth.SignInAnonymouslyAsync().ContinueWith(task => {
  // この中はUIスレッドで通る
  // 同じアカウントが既にあってもこの中は通る。
  if (task.IsCanceled)
  {
    Debug.LogError("SignInAnonymouslyAsync was canceled.");
    return;
  }
  if (task.IsFaulted)
  {
    Debug.LogError("SignInAnonymouslyAsync encountered an error: " + task.Exception); // 匿名が有効になって場合はこちらを通る。
    return;
  }
  Firebase.Auth.FirebaseUser newUser = task.Result;
  Debug.Log("User signed in successfully");
  Debug.Log("userName=" + newUser.DisplayName); // 匿名では空だった
  Debug.Log("userId=" + newUser.UserId); // こちらはX3TUGaMPQPaN1rmGL2CxhQ4z4712と表示
}, TaskScheduler.FromCurrentSynchronizationContext());
  1. 上の情報は作成処理をするたびに、UserIdは変わる。

公式:https://firebase.google.com/docs/auth/unity/anonymous-auth?hl=ja

ユーザ情報取得

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user != null) {
  string name = user.DisplayName;
  string email = user.Email;
  System.Uri photo_url = user.PhotoUrl;
  // The user's Id, unique to the Firebase project.
  // Do NOT use this value to authenticate with your backend server, if you
  // have one; use User.TokenAsync() instead.
  string uid = user.UserId;
}
  1. ユーザ情報は、再起動やキャッシュ削除してもUserIdは変わらないが、アプリデータ削除や再インストールではUserIdは変わる。

メールアドレス認証を使う場合

  1. web側のfirebaseコンソールでメール認証を有効にする(Authentication/ログイン方法/匿名/有効)
  2. "ユーザーがメールアドレスとパスワードを使用してログインできるようにします。"側だけon

アカウント作成処理

string email = "hogehoge@example.com";
string password = "hogehoge"; // 6文字以上でないとisFaulted側を通る
auth.CreateUserWithEmailAndPasswordAsync(email, password).ContinueWith(task => {
    // この中はUIが表示できない。
    if (task.IsCanceled)
    {
        Debug.LogError("CreateUserWithEmailAndPasswordAsync was canceled.");
        return;
    }
    if (task.IsFaulted)
    {
        Debug.LogError("CreateUserWithEmailAndPasswordAsync encountered an error: " + task.Exception);
        return;
    }
    // Firebase user has been created.
    Firebase.Auth.FirebaseUser newUser = task.Result;
    Debug.LogFormat("Firebase user created successfully: ({0}) ({1})",
                    newUser.DisplayName, newUser.UserId);
}, TaskScheduler.FromCurrentSynchronizationContext());

アカウントを作成してもメールは飛ばない、アカウントを作成した後、上の処理をすると既に同じアカウントがあるということで、IsFaulted側を通る。

メール認証のログイン

auth.SignInWithEmailAndPasswordAsync(email, password).ContinueWith(task => {
  // この中はUIが表示できない。
  if (task.IsCanceled) {
    Debug.LogError("SignInWithEmailAndPasswordAsync was canceled.");
    return;
  }
  if (task.IsFaulted) {
    Debug.LogError("SignInWithEmailAndPasswordAsync encountered an error: " + task.Exception);
    return;
  }

  Firebase.Auth.FirebaseUser newUser = task.Result;
  Debug.LogFormat("User signed in successfully: {0} ({1})",
      newUser.DisplayName, newUser.UserId);
}, TaskScheduler.FromCurrentSynchronizationContext());

メール認証のパスワード変更

firebaseコンソール側から管理者がパスワード変更用のurlをメールすることができる。

ユーザ情報取得

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user != null) {
  string name = user.DisplayName;
  string email = user.Email;
  System.Uri photo_url = user.PhotoUrl;
  // The user's Id, unique to the Firebase project.
  // Do NOT use this value to authenticate with your backend server, if you
  // have one; use User.TokenAsync() instead.
  string uid = user.UserId;
}

公式:https://firebase.google.com/docs/auth/unity/password-auth?hl=ja

匿名アカウントからメール認証アカウントに移行する

上記の匿名アカウント作成の後にメール認証アカウントを作成してしまうと、 メールアカウント作成時に別のuserIdが作られてしまうので、 以下のようにAuthCredentialを使ってつなぎこむ必要がある。

公式:https://firebase.google.com/docs/auth/unity/account-linking?hl=ja

以下AuthCredentialの使い方

まずは匿名アカウントを作る

Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
auth.SignInAnonymouslyAsync().ContinueWith(task => {
  // この中はUIスレッドで通る
  // 同じアカウントが既にあってもこの中は通る。
  if (task.IsCanceled)
  {
    Debug.LogError("SignInAnonymouslyAsync was canceled.");
    return;
  }
  if (task.IsFaulted)
  {
    Debug.LogError("SignInAnonymouslyAsync encountered an error: " + task.Exception); // 匿名が有効になって場合はこちらを通る。
    return;
  }
  Firebase.Auth.FirebaseUser newUser = task.Result;
  Debug.Log("User signed in successfully");
  Debug.Log("user=" + newUser.DisplayName); // 匿名では空だった
  Debug.Log("user=" + newUser.UserId); // こちらはX3TUGaMPQPaN1rmGL2CxhQ4z4712と表示
}, TaskScheduler.FromCurrentSynchronizationContext());

メール認証アカウントを匿名アカウントにつなぎこむ

上記処理の後に、以下処理をする

Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
string email = "hogehoge@example.com";
string password = "hogehoge"; // 6文字以上でないとisFaulted側を通る
Firebase.Auth.Credential credential = Firebase.Auth.EmailAuthProvider.GetCredential(email, password);
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user == null) {
  Debug.LogError("no user.");
  return;
}
user.LinkWithCredentialAsync(credential).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("LinkWithCredentialAsync was canceled.");
    return;
  }
  if (task.IsFaulted) {
    Debug.LogError("LinkWithCredentialAsync encountered an error: " + task.Exception); // 既にemailが登録されてる時はここを通る
    return;
  }

  Firebase.Auth.FirebaseUser newUser = task.Result;
  Debug.LogFormat("Credentials successfully linked to Firebase user: {0} ({1})",
      newUser.DisplayName, newUser.UserId);
}, TaskScheduler.FromCurrentSynchronizationContext());

ログアウト

Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
auth.SignOut();

戻りコールバック内でUIThreadを処理する

auth.SignInAnonymouslyAsync().ContinueWith(task =>
{
  // callback処理
});

以下のように第2引数にFromCurrentSynchronizationContextを追加する

using System.Threading.Tasks;
auth.SignInAnonymouslyAsync().ContinueWith(task =>
{
  // callback処理
}, TaskScheduler.FromCurrentSynchronizationContext());