Firebaseカスタム認証の実装
ストロボライト のエンジニア、小河原です。
今回は既に動いているアプリケーションに後からFirebaseを導入する、という業務で多々ある、しかしWebにはあまり詳しく情報がない「カスタム認証」について書きたいと思います。
同じように実装する人の少しでもお役に立てればいいなと。ハイ。
Firebaseアプリケーションは作成済み前提で、
How to カスタム認証 Let'sスタートです!!
やったこと
カスタム認証とは
FirebaseはGoogleが提供するBaaSです。Firebase AuthenticationというSNSやSMS認証機能も提供されているため、サーバーレスで新規アプリケーションを作る際にはとても便利です。
提供されている認証方法のうち、既にユーザー認証機能は自社システムで持っていて後からFirebaseの認証のみを追加するケースのために、提供されているのがカスタム認証です。
カスタムトークン(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の機能も使いたい、、って思ってる人は是非カスタム認証を使って始めてみてください!
技術の話に限らず今後も投稿していきますので、よろしくお願いします!