ストロボライトで働くエンジニアの徒然日記

株式会社ストロボライトのエンジニア開発ブログです。LOVEGREEN、botapii、MIDOLASを支えるエンジニアの日々の生活を綴っていきます

ストロボライトで働くエンジニアの徒然日記

株式会社ストロボライトのエンジニア開発ブログです。LOVEGREEN、botapii、MIDOLASを支えるエンジニアの日々の生活を綴っていきます

Firebaseカスタム認証の実装

f:id:strobolight-developers:20181105142247j:plain

ストロボライト のエンジニア、小河原です。

今回は既に動いているアプリケーションに後からFirebaseを導入する、という業務で多々ある、しかしWebにはあまり詳しく情報がない「カスタム認証」について書きたいと思います。

同じように実装する人の少しでもお役に立てればいいなと。ハイ。

Firebaseアプリケーションは作成済み前提で、
How to カスタム認証 Let'sスタートです!!

やったこと

カスタム認証とは

FirebaseはGoogleが提供するBaaSです。Firebase AuthenticationというSNSやSMS認証機能も提供されているため、サーバーレスで新規アプリケーションを作る際にはとても便利です。

提供されている認証方法のうち、既にユーザー認証機能は自社システムで持っていて後からFirebaseの認証のみを追加するケースのために、提供されているのがカスタム認証です。

証明書の取得

f:id:strobolight-developers:20181102110400p:plain

  1. 歯車アイコンからプロジェクトの設定へ移動
  2. グローバルナビのサービスアカウントへ移動
  3. 新しい秘密鍵の生成から秘密鍵をダウンロード
  4. すべてのサービスアカウントを管理へ移動

IAMロールの設定

f:id:strobolight-developers:20181102111207p:plain

admin-sdkアカウントのIAMロールにサービスアカウントトークン作成者権限を付与します。

カスタムトークン(IDトークン)発行処理

private-key.pemファイルの作成

ダウンロードした秘密鍵からprivate-key.pemを作成します。秘密鍵テキストエディタで開くとprivate-keyやpublic-key等pemファイル作成に必要な情報が記載されています。

pemファイルはpemファイルとして読み込まれるためのフォーマットがありますので、フォーマットに沿って作成しましょう。そして作成が終わったら、既存の認証サーバーに配置しましょう。

参考記事
qiita.com

カスタムトークンの作成

こちらはPHPのLaravelフレームワークを使用して書いたサンプルコードです。
FirebaseのカスタムトークンはJWTフォーマットなので、JWT変換するためにライブラリを使用しています。

<?php
# 説明①
use Firebase\JWT\JWT;

class FirebaseHelper
{
    static function issueFirebaseCustomToken($uid, $is_premium_account) {
        // Get your service account's email address and private key from the JSON key file
        $service_account_email = env('SERVICE_EMAIL');
        # 説明②
        $private_key = Storage::get('/firebase/private-key.pem');

        $now_seconds = time();
        $payload = array(
             "iss" => $service_account_email,
             "sub" => $service_account_email,
             "aud" => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
             "iat" => $now_seconds,
             "exp" => $now_seconds+(60*60),  // Maximum expiration time is one hour
             "uid" => $uid,
             "claims" => array(
                 "premium_account" => $is_premium_account
                 )
             );
             return JWT::encode($payload, $private_key, "RS256");
      }
}

ユーザー認証後に、ここで作成したカスタムトークンも付与して、フロントに返却します。
フロントはこのカスタムトークンを使用し、FirebaseのsignInWithCustomToken(token)を呼び出す事で認証が行えます。

まとめ

カスタム認証便利!!そして新規のモバイルアプリケーションを作成する際はユーザー認証もFIrebaseに寄せてmBaaSとして最大限活用できれば開発スピードが上がる事は間違いないと思います。
既に認証機能あるし、、でもFirebaseの機能も使いたい、、って思ってる人は是非カスタム認証を使って始めてみてください!

技術の話に限らず今後も投稿していきますので、よろしくお願いします!