🦄

メールアドレス認証 - UnityでSDKなしでFirebaseを使う 

2021/06/21に公開

Unityからのメールアドレスとパスワードを使った認証方式を解説します。

この投稿はUnityでSDKなしでFirebaseを使うの一部です。

ソースコード全体は以下にあります。
https://github.com/satouso0401/firebase-unity-not-use-sdk/blob/main/Assets/Scenes/Authentication/EmailPasswordScript.cs

Firebase Authenticationの設定

サイドメニュー Authentication > Sign-in method タブ
の画面から メールアドレス / パスワード を有効にします。

Unity側のユーザー登録の実装

Firebasseプロジェクト作成で取得したAPIキーを使用してユーザー登録を行います。
ユーザー登録のAPIは登録したレスポンスとして、idTokenrefreshTokenが返ってきます。
idTokenrefreshTokenについてはログインの実装部分で説明します。

var _apiKey = "APIキー";
var inputEmail = "メールアドレス";
var inputPassword = "パスワード";

WebClient wc = new WebClient();
wc.Headers[HttpRequestHeader.ContentType] = "application/json";
var url = $"https://identitytoolkit.googleapis.com/v1/accounts:signUp?key={_apiKey}";
var requestBody = new FirebaseApi.EmailPasswordAuthRequest(inputEmail, inputPassword).ToJson();
var response = wc.UploadString(new Uri(url), requestBody);
Debug.Log($"idToken: {authResult.idToken}");
Debug.Log($"refreshToken: {authResult.refreshToken}");

参考: https://cloud.google.com/identity-platform/docs/use-rest-api#section-create-email-password

ユーザー追加の確認

AuthenticationのUsersタブで登録されたユーザーを確認することができます。

Unity側のログインの実装

ログインについてはユーザー登録とurlが異なるだけで処理の流れは同様です。

var _apiKey = "APIキー";
var inputEmail = "メールアドレス";
var inputPassword = "パスワード";

WebClient wc = new WebClient();
wc.Headers[HttpRequestHeader.ContentType] = "application/json";
var url = $"https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key={_apiKey}";
var requestBody = new FirebaseApi.EmailPasswordAuthRequest(inputEmail, inputPassword).ToJson();
var response = wc.UploadString(new Uri(url), requestBody);
var authResult = FirebaseApi.EmailPasswordAuthResponse.FromJson(response);
Debug.Log($"idToken: {authResult.idToken}");
Debug.Log($"refreshToken: {authResult.refreshToken}");

レスポンスのidTokenはFirebaseでユーザーを識別しアクセストークンの役割をもつトークンで、他のFirebase関連のサービスを利用する際の認証情報として使います。idTokenの有効期限は30分程度なので、有効期限が切れてしまった場合はrefreshTokenを使用して新しいidTokenを取得します。このrefreshTokenをローカルストレージなどに保存することで、パスワードを保存せず安全にログイン状態を保つことができます。
具体的なトークンのリフレッシュ方法については別の投稿で解説します。

参考: https://cloud.google.com/identity-platform/docs/use-rest-api#section-sign-in-email-password

その他補足

AndroidでNameResolutionFailure例外が発生する場合は、
Player settingsInternet Accessrequired  に設定してください。

Discussion