やりたいこと

フロントエンドで Firebase から受け取った ID トークンをバックエンドに転送し、バックエンドでその正当性を検証する。


Laravel + Firebase のプロジェクトです。

Firebase のドキュメントには複数言語でコードが掲載されていますが、PHP のコードありません。

Firebase
ID トークンを確認する
https://firebase.google.com/docs/auth/admin/verify-id-tokens?hl=ja

kreait/firebase-php を使って同様のことができ、その方法について掲載いたします。

環境

  • PHP 7.1 系
  • Laravel 5.5
  • kreait/firebase-php ^4.0

実装方法

当記事では Firebase Admin SDK for PHP を利用します。

Firebase Admin SDK for PHP
https://firebase-php.readthedocs.io/en/latest/index.html

Laravel との連携は、Firebase 用のサービスプロバイダ追加し、アプリケーションからはそれを利用する実装とします。

当サンプルは、次の Issue を参考に実装手順をまとめまたものです。

How to use with Laravel?
https://github.com/kreait/firebase-php/issues/61

パッケージのインストール

まずは composer コマンドを実行し今回利用するパッケージをインストールします。

1composer require kreait/firebase-php ^4.0
kreait/firebase-php
https://github.com/kreait/firebase-php

接続情報の定義

Firebase の接続情報を定義する config ファイルを作りましょう。

1cd [アプリケーションのルートディレクトリ]
2touch config/firebase.php

作成したファイルは次のようにします。

1<?php
2return [
3  'servie_account_path' => env('FIREBASE_SERVICE_ACCOUNT_PATH'),
4  'database_uri'        => env('FIREBASE_DATABASE_URI'),
5];

対応する定義を .env.env.example にも追加します。

1FIREBASE_SERVICE_ACCOUNT_PATH=
2FIREBASE_DATABASE_URI=

.env にはご自身の Firebase アプリケーション情報を設定してください。

サービスプロバイダ

artisan コマンドを実行してサービスプロバイダを生成します。

1$ php artisan make:provider FirebaseServiceProvider

ファイルは /app/Providers/FirebaseServiceProvider.php に生成されます。
このファイルを編集し、次のようにします。

 1<?php
 2namespace App\Providers;
 3
 4use Kreait\Firebase;
 5use Kreait\Firebase\ServiceAccount;
 6use Kreait\Firebase\Factory as FirebaseFactory;
 7use Illuminate\Support\ServiceProvider;
 8
 9class FirebaseServiceProvider extends ServiceProvider
10{
11    /**
12     * Bootstrap the application services.
13     *
14     * @return void
15     */
16    public function boot()
17    {
18        //
19    }
20
21    /**
22     * Register the application services.
23     *
24     * @return void
25     */
26    public function register()
27    {
28        $this->app->singleton(Firebase::class, function() {
29            $servieAccountPath = \Config::get('firebase.servie_account_path');
30            $databaseUri       = \Config::get('firebase.database_uri');
31
32            return (new FirebaseFactory())
33                ->withServiceAccount(ServiceAccount::fromJsonFile(base_path($servieAccountPath)))
34                ->withDatabaseUri($databaseUri)
35                ->create();
36        });
37
38        $this->app->alias(Firebase::class, 'firebase');
39    }
40}

このサービスプロバイダをアプリケーションに追加します。

config/app.php を次のように編集します。

1    'providers' => [
2        :
3+       App\Providers\FirebaseServiceProvider::class,
4    ],

使用例

1<?php
2$firebase = app('firebase');
3try {
4    return $firebase->getAuth()->verifyIdToken($idTokenString);
5} catch (\Firebase\Auth\Token\Exception\InvalidToken $e) {
6    // TODO 例外処理
7}

おわりに

カンタンに高機能なアプリケーションが構築できる Firebase はとても便利ですね。
こういったサービスを上手く褐葉することで、おもしろい Web アプリをどんどん開発できそうです。


“WEB+DB PRESS Vol.105” は Firebase を特集してますよ。