14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Firebase Cloud Functions

Last updated at Posted at 2018-03-06

Firebase を使うとサーバ側のコードを書かなくても色々な事が出来るが、機能が足りない時に Cloud Functions というのを使ってちょっとした処理を行う事が出来る。試しに Firebase Admin API を使って JSON Web Token を発行してみた。

事前準備: 秘密鍵の発行

Cloud Functions だけなら必須ではないが、Firebase Admin API を使うために秘密鍵を発行する。

  • Firebase Console > Settings (歯車) > SERVICE ACCOUNTS
  • Generate New Private Key
  • Private Key がダウンロードされるので serviceAccountKey.json という名前で保存する。

環境のセットアップ

Cloud Functions にも firebase-tools が必要なので確認。

npm install -g firebase-tools

現在のディレクトリに Cloud Functions プロジェクトを作る。

firebase init functions

すでに現在のディレクトリで Firebase hosting を使っている場合は firebase.json に Cloud Functions の設定を追加してくれる。上書きで消される事は無い。言語として TypeScript を選ぶと適当に TypeScript 環境を設定してくれる。プログラムは functions/src/index.ts に関数を書く。

JSON Web Token を発行する例

とりあえず何も考えず発行する。../config/serviceAccountKey.json に秘密鍵が置いてあること前提。

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
const serviceAccount = require('../config/serviceAccountKey.json');

admin.initializeApp({
    // ...functions.config().firebase,
    credential: admin.credential.cert(serviceAccount),
});

let serial = 0;

export const getToken = functions.https.onRequest((req, res) => {
    serial++;
    const uid = `user-${serial}`;
    admin.auth().createCustomToken(uid, {})
        .then((token: string) => {
            console.log(token)
            res.send(token);
        })
        .catch((error: any) => {
            console.log("Error creating custom token:", error);
        });
});

テスト実行

cd functions
npm run build
firebase serve --only functions

これで http://localhost:5000/physeter-idpoc/us-central1/getToken あたりにアクセスすると動作確認出来る。

hosting と functions 同時にローカルでテストしたい場合は

firebase serve --only functions,hosting

のようにすると良い。localhost に functions hosting それぞれ別のポートでサービスが立ち上がり便利。

注意点としては、以前に Firebase hosting を firebase serve でテストした事がある場合、http://localhost:5000 にアクセスして Crtl + Reload でキャッシュをクリアする必要があった。キャッシュをクリアしないと古いコンテンツが見えてしまう。

デプロイ

firebase deploy --only functions

ここで表示された URL にアクセスすると結果が表示される。

コツ

functions/tsconfig.json に 以下のような typeRoots を入れないと親ディレクトリまで参照して面倒な事になる。-> ややこしいので hosting と functions は完全に分けるべきか。

  "compilerOptions": {
    ...
    "typeRoots": ["./node_modules/@types"]
    ...
  }

参考

14
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?