Firebaseのカスタム認証設定

前回、ポムさんがFirebaseのチャット作成の記事を書きましたが、これそのままでは投稿者のユーザ判定は行われておらず、サービスに組み込むことはできません。
そこで今回はFirebaseのユーザ認証のうち、既存のサービスとの連携が可能なカスタム認証のやり方について書きたいと思います。

※この記事におけるFirebaseのバージョンは3.1.0です。

カスタム認証では他の認証方式とは異なり、Firebase内にユーザの認証情報を持ちません。
そのため、下記の手順で認証を行うことになります。

既存サービスのサーバでユーザ認証を行う

サーバから既存のユーザIDでFirebaseにアクセストークンを発行してもらう

アクセストークンをクライアントに返す

クライアントがアクセストークンでFirebaseにログイン

既存のユーザIDでFirebaseにアクセス可能

■秘密鍵の生成
既存サービスのサーバとFirebase間のアクセスは、秘密鍵でセキュリティを担保します。
そのためまず始めに、サーバに置く秘密鍵を生成する必要があります。
※Firebaseのプロジェクトが既に作成されている前提とします。
下記のURLからGoogle Cloudの証明書ページに飛びます。
https://console.developers.google.com/projectselector/apis/credentials

SS1
認証したいFirebaseのプロジェクトを選択してください。

SS2
認証情報 → 認証情報を作成 → サービスアカウントキー の順で選択してください。

SS3
「新しいサービスアカウント」で、サービスアカウント名には適当な値を入れ、キーのタイプはJSONとして作成してください。

SS4
キーがダウンロードされます。
ポップアップの通り、このキーは再発行されないため、取り扱いには気を付けてください。

■サーバ側設定
今回はPHPで実装を行います。
下記のページを参考にしています。PHP以外については下記ページを参照してください。
https://firebase.google.com/docs/auth/server/create-custom-tokens

・ライブラリの導入
composerを使用している場合、下記のコマンドを実行してください

composerを使用しない場合、下記からダウンロードして直接入れてください。
https://github.com/firebase/php-jwt

・アクセストークン発行プログラム
サンプルプログラムは下記の通りです。
IDとパスワードをPOSTするとアクセストークンを返すプログラムになります。
実際の実装時にはセッションからユーザIDを取得する等の処理になるかと思います。

・test-auth.php

■パーミッションルール設定
FirebaseコンソールのDatabase → ルールからパーミッションのルールを設定します。
ルールの記法等についてはここでは割愛しますが、テストプログラム動作確認のため、下記のように設定します。

また、Database → データから”test1″,”test2″,”test3″を設定しておきましょう。

■クライアント
https://localhostで下記のページを動作させます。
localhost以外で動かしたい場合には、コンソールからAuth → ログイン方法 → OAuth リダイレクト ドメイン にドメインを追加してください。
※httpsでないとFirebaseのアクセス時にエラーが出ます。

・auth-test.js

■実行結果

SS5
ログイン後、”test1″,”test2″,”test3″の右にルールに設定した条件に当てはまる場合には設定値が、当てはまらない場合には”invalid”が表示されるはずです。

上記のソースコードそのままであれば、”test1″は必ず、”test2″はE-mailが”admin”のとき、”test3″はPasswordが”test”のときに表示されるでしょう。

■まとめ
claimsの値を使えば、複雑なアクセス制御もわりと簡単に実装できそうです。
秘密鍵が漏れるとアクセスし放題なので、当然ながらセキュリティには気を付けること。
実際に利用する際には既存のユーザIDそのものではなく、Firebase上で利用するためのユーザ毎に一意なIDを別に作成して利用するほうがセキュアでしょう。

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です