Firebase Authentication トリガー

Cloud Functions は、Firebase Authentication のイベントによってトリガーできます。これには、ユーザーの作成やユーザーの削除などのイベントが含まれます。たとえば、アプリでアカウントを作成したばかりのユーザーに登録完了の通知メールを送信できます。

イベントタイプ

Firebase Authentication は、createdelete イベントに応じて関数をトリガーできます。

イベントタイプ トリガー
providers/firebase.auth/eventTypes/user.create ユーザー アカウントが作成されるとトリガーされます。
providers/firebase.auth/eventTypes/user.delete ユーザー アカウントが削除されるとトリガーされます。

ユーザーの作成

Firebase アカウントでは、以下の場合に Cloud Functions のユーザー作成イベントがトリガーされます。

  • ユーザーがメール アカウントとパスワードを作成します。

  • ユーザーがフェデレーション ID プロバイダを使用して初めてログインします。

  • デベロッパーが Firebase Admin SDK を使用してアカウントを作成します。

  • ユーザーが新しい匿名 Auth セッションに初めてログインします。

ユーザーの削除

ユーザーの削除時にトリガーするように関数を構成することもできます。

イベントの構造

イベントデータは、UserRecord オブジェクトとして指定されます。

以下に、パスワード ベースのアカウントの作成イベントの例を示します。

{
  "email": "me@example.com",
  "metadata": {
      "createdAt": "2018-10-19T19:29:16Z"
  },
  "uid": "XXXXX"
}

このオブジェクトの一部のプロパティは、特定の認証方法を使用する場合にのみ定義されます。たとえば、パスワード ベースのアカウント イベントは、ユーザーのメールアドレスを含む email プロパティを定義します。プロジェクトに固有のユーザー ID を含む uid プロパティは常に定義されます。

サンプルコード

Node.js

/**
 * Triggered by a change to a Firebase Auth user object.
 *
 * @param {!Object} event The Cloud Functions event.
 */
exports.helloAuth = (event) => {
  try {
    console.log(`Function triggered by change to user: ${event.uid}`);
    console.log(`Created at: ${event.metadata.createdAt}`);

    if (event.email) {
      console.log(`Email: ${event.email}`);
    }
  } catch (err) {
    console.error(err);
  }
};

Python

import json
def hello_auth(data, context):
    """ Triggered by creation or deletion of a Firebase Auth user object.
     Args:
            data (dict): The event payload.
            context (google.cloud.functions.Context): Metadata for the event.
    """
    print('Function triggered by creation/deletion of user: %s' % data["uid"])
    print('Created at: %s' % data["metadata"]["createdAt"])

    if 'email' in data:
        print('Email: %s' % data["email"])

Go


// Package firebase contains a Firestore Cloud Function.
package firebase

import (
	"context"
	"log"
	"time"
)

// AuthEvent is the payload of a Firestore Auth event.
type AuthEvent struct {
	Email    string `json:"email"`
	Metadata struct {
		CreatedAt time.Time `json:"createdAt"`
	} `json:"metadata"`
	UID string `json:"uid"`
}

// HelloAuth is triggered by Firestore Auth events.
func HelloAuth(ctx context.Context, e AuthEvent) error {
	log.Printf("Function triggered by creation or deletion of user: %q", e.UID)
	log.Printf("Created at: %v", e.Metadata.CreatedAt)
	if e.Email != "" {
		log.Printf("Email: %q", e.Email)
	}
	return nil
}

Java

import com.google.cloud.functions.Context;
import com.google.cloud.functions.RawBackgroundFunction;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.util.logging.Logger;

public class FirebaseAuth implements RawBackgroundFunction {
  private static final Logger logger = Logger.getLogger(FirebaseAuth.class.getName());

  // Use GSON (https://github.com/google/gson) to parse JSON content.
  private static final Gson gson = new Gson();

  @Override
  public void accept(String json, Context context) {
    JsonObject body = gson.fromJson(json, JsonObject.class);

    if (body != null && body.has("uid")) {
      logger.info("Function triggered by change to user: " + body.get("uid").getAsString());
    }

    if (body != null && body.has("metadata")) {
      JsonObject metadata = body.get("metadata").getAsJsonObject();
      logger.info("Created at: " + metadata.get("createdAt").getAsString());
    }

    if (body != null && body.has("email")) {
      logger.info("Email: " + body.get("email").getAsString());
    }
  }
}

関数のデプロイ

関数をデプロイするには、Firebase Authentication が構成されているイベントタイプとプロジェクトを指定する必要があります。Cloud Console にはイベントタイプのフィールドが 1 つ表示されます。これは、プロジェクトが関数を含むプロジェクトと同じであると想定されるためです。

コマンドラインの場合は、この 2 つのパラメータを指定するために特定の文字列を使用する必要があります。次の gcloud コマンドは、ユーザーの create イベントによってトリガーされる関数をデプロイします。

gcloud functions deploy YOUR_FUNCTION_NAME \
  --trigger-event providers/firebase.auth/eventTypes/user.create \
  --trigger-resource YOUR_PROJECT_ID \
  --runtime RUNTIME
引数 説明
--trigger-event NAME 関数をトリガーするイベントタイプの名前。 この場合、上記のように create または delete のいずれかにする必要があります。
--trigger-resource NAME 関数と Firebase Authentication を含むプロジェクトのプロジェクト ID(この例では YOUR_PROJECT_ID)。
--runtime RUNTIME 使用しているランタイムの名前。網羅的なリストについては、gcloud リファレンスをご覧ください。