「Unity/Firebase/Authentication」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→アカウント作成処理) |
|||
(同じ利用者による、間の4版が非表示) | |||
行30: | 行30: | ||
Debug.Log("userName=" + newUser.DisplayName); // 匿名では空だった | Debug.Log("userName=" + newUser.DisplayName); // 匿名では空だった | ||
Debug.Log("userId=" + newUser.UserId); // こちらはX3TUGaMPQPaN1rmGL2CxhQ4z4712と表示 | Debug.Log("userId=" + newUser.UserId); // こちらはX3TUGaMPQPaN1rmGL2CxhQ4z4712と表示 | ||
− | }); | + | }, TaskScheduler.FromCurrentSynchronizationContext()); |
</pre> | </pre> | ||
行76: | 行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> | </pre> | ||
アカウントを作成してもメールは飛ばない、アカウントを作成した後、上の処理をすると既に同じアカウントがあるということで、IsFaulted側を通る。 | アカウントを作成してもメールは飛ばない、アカウントを作成した後、上の処理をすると既に同じアカウントがあるということで、IsFaulted側を通る。 | ||
行96: | 行96: | ||
Debug.LogFormat("User signed in successfully: {0} ({1})", | Debug.LogFormat("User signed in successfully: {0} ({1})", | ||
newUser.DisplayName, newUser.UserId); | newUser.DisplayName, newUser.UserId); | ||
− | }); | + | }, TaskScheduler.FromCurrentSynchronizationContext()); |
</pre> | </pre> | ||
行146: | 行146: | ||
Debug.Log("user=" + newUser.DisplayName); // 匿名では空だった | Debug.Log("user=" + newUser.DisplayName); // 匿名では空だった | ||
Debug.Log("user=" + newUser.UserId); // こちらはX3TUGaMPQPaN1rmGL2CxhQ4z4712と表示 | Debug.Log("user=" + newUser.UserId); // こちらはX3TUGaMPQPaN1rmGL2CxhQ4z4712と表示 | ||
− | }); | + | }, TaskScheduler.FromCurrentSynchronizationContext()); |
</pre> | </pre> | ||
行156: | 行156: | ||
string password = "hogehoge"; // 6文字以上でないとisFaulted側を通る | string password = "hogehoge"; // 6文字以上でないとisFaulted側を通る | ||
Firebase.Auth.Credential credential = Firebase.Auth.EmailAuthProvider.GetCredential(email, password); | Firebase.Auth.Credential credential = Firebase.Auth.EmailAuthProvider.GetCredential(email, password); | ||
− | auth.CurrentUser.LinkWithCredentialAsync(credential).ContinueWith(task => { | + | Firebase.Auth.FirebaseUser user = auth.CurrentUser; |
+ | if (user == null) { | ||
+ | Debug.LogError("no user."); | ||
+ | return; | ||
+ | } | ||
+ | user.LinkWithCredentialAsync(credential).ContinueWith(task => { | ||
if (task.IsCanceled) { | if (task.IsCanceled) { | ||
Debug.LogError("LinkWithCredentialAsync was canceled."); | Debug.LogError("LinkWithCredentialAsync was canceled."); | ||
行169: | 行174: | ||
Debug.LogFormat("Credentials successfully linked to Firebase user: {0} ({1})", | Debug.LogFormat("Credentials successfully linked to Firebase user: {0} ({1})", | ||
newUser.DisplayName, newUser.UserId); | newUser.DisplayName, newUser.UserId); | ||
− | }); | + | }, TaskScheduler.FromCurrentSynchronizationContext()); |
</pre> | </pre> | ||
行175: | 行180: | ||
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance; | Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance; | ||
auth.SignOut(); | auth.SignOut(); | ||
+ | |||
+ | ==戻りコールバック内でUIThreadを処理する== | ||
+ | <pre> | ||
+ | auth.SignInAnonymouslyAsync().ContinueWith(task => | ||
+ | { | ||
+ | // callback処理 | ||
+ | }); | ||
+ | </pre> | ||
+ | |||
+ | 以下のように第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
匿名認証を使う場合
- 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());
- 上の情報は作成処理をするたびに、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; }
- ユーザ情報は、再起動やキャッシュ削除してもUserIdは変わらないが、アプリデータ削除や再インストールではUserIdは変わる。
メールアドレス認証を使う場合
- web側のfirebaseコンソールでメール認証を有効にする(Authentication/ログイン方法/匿名/有効)
- "ユーザーがメールアドレスとパスワードを使用してログインできるようにします。"側だけ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());