FirebaseはGoogleが提供しているモバイルアプリ開発向けバックエンドサービスです。前回は認証について紹介しましたが、今回はそれをベースに匿名認証を使ってみたいと思います。匿名認証はIDやパスワードの設定が必要ない、簡易的な認証です。

Firebaseの設定

Firabaseコンソールで、[Authentication]メニュー > [ログイン方法]タブを選択し、匿名ログインを有効化します。

テンプレートの修正

前回作成したVueのテンプレートを、以下のように変更します。

<div>
    <div class="center"> Firebase認証 </div>
    <section style="margin: 10px;" v-if="user.isLoggedIn">
        <p v-if="user.isAnonymous">匿名ユーザ</p>
        <p v-else>{{user.mailAddress}}</p>

        <section style="margin: 10px;">
            <button @click="logout">ログアウト</button>
        </section>
    </section>
    <section v-else style="margin: 10px;">
        <p>メールアドレス</p>
        <p>
            <input v-model="user.mailAddress" placeholder="メールアドレス" />
        </p>
        <p>パスワード</p>
        <p>
            <input v-model="user.password" placeholder="パスワード" type="password" />
        </p>
        <button @click="register">新規登録</button>
        <button @click="login">ログイン</button>
        <button @click="anonymouse">匿名でログイン</button>
    </section>
</div>

変更箇所は次の通りです。

まず匿名ユーザとしてログインするためのボタンを設置します。

<button @click="anonymouse">匿名でログイン</button>

前回はログイン後にメールアドレスを表示しましたが、匿名ユーザでログインした場合はメールアドレスがありません。そのためログインユーザの表示処理を変更します。匿名ユーザであることを表す user.isAnonymous (コードは後述)がtrueであれば「匿名ユーザ」と表示します。

<p v-if="user.isAnonymous">匿名ユーザ</p>
<p v-else>{{user.mailAddress}}</p>

JavaScriptの処理

次にデータの初期化についてです。匿名ユーザであることを表す isAnonymous を追加します。

// 初期データの設定
data: {
    user: {
        isLoggedIn: false,
        mailAddress: "",
        password: "",
        isAnonymous: false // 追加
    }
},

isAnonymousはデフォルトではfalseに設定しています。

ログイン処理を実行すると、ユーザの認証状態変更を検知する firebase.auth().onAuthStateChanged が実行されます。Firebaseから返ってくるuserオブジェクトの中にisAnonymousが含まれており、匿名ユーザの場合はisAnonymousの値がtrueになります。

ログアウト時は変数userがnullになります。

// デプロイ完了時のイベント
created: function() {
    // ユーザの認証ステータスが変わったら通知
    var me = this;
    firebase.auth().onAuthStateChanged(function(user) {
        // 匿名ユーザチェック
        if (user) {
            me.user.isAnonymous = user.isAnonymous;
            me.user.mailAddress = user.email;
        }
        me.user.isLoggedIn = (user !== null);
    });
},

匿名認証を行う

Vueのイベント処理の中に、匿名認証を行うイベントを追加します。匿名認証を行うにはFirebaseに用意されている firebase.auth().signInAnonymously() を実行します。

// イベント処理
methods: {
    …省略…

    // 匿名認証を行う
    anonymouse: function() {
        firebase.auth().signInAnonymously()
        .catch(function(error) {
            alert(error.message);
        });
    },
}

認証が完了すると認証ステータスが変化して、上記 firebase.auth().onAuthStateChanged が実行されます。

以上で匿名認証が完了です。アプリを実行すると、匿名ユーザが追加されていることがFirabaseコンソールで確認できます。

全体のソースコードは以下のようになります。

var onDeviceReady = function() {
    // Firebaseの初期化
    var config = {
        apiKey: "API_KEY",
        authDomain: "AUTH_DOMAIN",
        databaseURL: "DATABASE_URL",
        projectId: "PROJECT_ID",
        storageBucket: "STORAGE_BUCKET",
        messagingSenderId: "MESSAGING_SENDER_ID"
    };
    firebase.initializeApp(config);

    // Vueの処理
    var vm = new Vue({
        el: '#app',  // マウントするDOM
        // 初期データの設定
        data: {
            user: {
                isLoggedIn: false,
                mailAddress: "",
                password: "",
                isAnonymous: false // 追加
            }
        },

        // デプロイ完了時のイベント
        created: function() {
            // ユーザの認証ステータスが変わったら通知
            var me = this;
            firebase.auth().onAuthStateChanged(function(user) {
                // 匿名ユーザチェック
                if (user) {
                    me.user.isAnonymous = user.isAnonymous;
                    me.user.mailAddress = user.email;
                }
                me.user.isLoggedIn = (user !== null);
            });
        },

        // テンプレート
        template: `
            <div>
                <div class="center"> Firebase認証 </div>
                <section style="margin: 10px;" v-if="user.isLoggedIn">
                    <p v-if="user.isAnonymous">匿名ユーザ</p>
                    <p v-else>{{user.mailAddress}}</p>

                    <section style="margin: 10px;">
                        <button @click="logout">ログアウト</button>
                    </section>
                </section>
                <section v-else style="margin: 10px;">
                    <p>メールアドレス</p>
                    <p>
                        <input v-model="user.mailAddress" placeholder="メールアドレス" />
                    </p>
                    <p>パスワード</p>
                    <p>
                        <input v-model="user.password" placeholder="パスワード" type="password" />
                    </p>
                    <button @click="register">新規登録</button>
                    <button @click="login">ログイン</button>
                    <button @click="anonymouse">匿名でログイン</button>
                </section>
            </div>`,

        // イベント処理
        methods: {
            // 登録処理
            register: function() {
                firebase.auth().createUserWithEmailAndPassword(this.user.mailAddress, this.user.password)
                .catch(function(error) {
                    alert(error.message);
                });
            },

            // ログイン処理
            login: function() {
                firebase.auth().signInWithEmailAndPassword(this.user.mailAddress, this.user.password)
                .catch(function(error) {
                    alert(error.message);
                });
            },

            // 匿名認証を行う
            anonymouse: function() {
                firebase.auth().signInAnonymously()
                .catch(function(error) {
                    alert(error.message);
                });
            },

            // ログアウト処理
            logout: function() {
                firebase.auth().signOut();
            }
        }
    });
};
document.addEventListener(window.cordova ?"deviceready" : "DOMContentLoaded", onDeviceReady, false);

今回のコードはmoongift/monaca_firebase_anonymouse_authにアップロードしてあります。実装時の参考にしてください。

匿名ユーザは利用者にユーザ情報の入力を促さがなくても使えますので、ログイン機能を持たないアプリでも、ユーザ固有のデータをセキュアに保持する用途等で利用できるでしょう。

Firebase