nodejs + firebase admin sdkを使用してカスタム認証を試す

対象のシステムにすでに独自認証がある状態でもfirebaseの認証に対応したい場合があります。
例えば
・firebaseに認証させて、realtimedb などのfirebaseの機能を使用したい場合
・独自認証以外にもfirebaseとの認証を組み合わせる必要が出た場合

今回は前任者の方が実装した独自実装+他の認証の要件が出たため、一旦その認証をfirebaseに合わせることにしました。

イメージ的には
サーバサイドで独自認証した時に返却するIDをfirebase admin sdkを用いてtokenに変化したものをレスポンスし、クライアントサイドでそのtokenを使用してfirebaseに認証する
という形になります

サーバサイド(nodejs)
firebase-admin sdkをnpmでインストールします

"firebase-admin": "^5.4.2",

設定を使用する部分に記載します。
serviceAccount内のデータは、プロジェクトのタブ「サービスアカウント」を押下すると「新しい鍵の生成」のボタンを押下するとjsonでダウンロードできます。

const admin = require('firebase-admin');
const serviceAccount = {
    'type': 'service_account',
    'project_id': 'xxxxxxxxxxx',
    'private_key_id': 'xxxxxxxxxxxxxxxxx',
    'private_key': '-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxxxxxxx==\n-----END PRIVATE KEY-----\n',
    'client_email': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.iam.gserviceaccount.com',
    'client_id': 'xxxxxxxxxxxxxxxxxx',
    'auth_uri': 'https://accounts.google.com/o/oauth2/auth',
    'token_uri': 'https://accounts.google.com/o/oauth2/token',
    'auth_provider_x509_cert_url': 'https://www.googleapis.com/oauth2/v1/certs',
    'client_x509_cert_url': 'https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-xxxxxxxxxxxxxxxxxxxxxxx.iam.gserviceaccount.com'
};
const firebaseAppAdmin = admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
});

* admin.initializeAppの中で、使用するサービスを追加することで機能を追加できます。(例えばdbなど)

独自に認証している既存のソースでレスポンス内容の返却を変更する

変更前

   if (data.Result.Request.IsValid === 'True') {
                        res.json({user: 'ユーザのid'});
                    } else {
                        res.status(422).json({error: "validation error"});
                    }

変更後

   if (data.Result.Request.IsValid === 'True') {
                        firebaseAppAdmin.auth().createCustomToken('ユーザのid').then(function (token) {
                                res.json({token: token});
                        }).catch(function (error) {
                                console.log(error);
                                res.json({});
                         });
                    } else {
                        res.status(422).json({error: "validation error"});
                    }

*比較していただければわかると思いますが、実際のログインの処理後ユーザIDをそのまま返却してたのを、firebaseのtokenに変更して返却するようにするだけです。

クライアントサイド(reactjs)
導入はこちら
あとは返却されたtokenを受け取ったクライアントサイドで、firebaseで認証します。
tokenがサーバサイドから返却された{token: token}の値となります。

firebaseAuth.signInWithCustomToken(token).then(function (user) {
                       resolve();
                }).catch(function (error) {
                      console.log('Sign In Error', error);
                        reject(ApiErrorManager.handle('AUTH.SIGNIN', e));
                });

上記の処理後、firebaseコンソール画面で、ユーザを見ると’ユーザのid’でユーザがカスタム認証という位置付けで追加されています。

コメントを残す

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

Bitnami