Pemicu Firebase Authentication

Fungsi Cloud Run dapat dipicu oleh peristiwa dari Firebase Authentication dalam project Google Cloud yang sama dengan fungsi. Peristiwa ini mencakup pembuatan dan penghapusan pengguna. Misalnya, Anda dapat mengirim email sambutan kepada pengguna yang baru saja membuat akun di aplikasi Anda.

Jenis peristiwa

Firebase Authentication dapat memicu fungsi sebagai respons terhadap peristiwa create dan delete pengguna.

Jenis Peristiwa Pemicu
providers/firebase.auth/eventTypes/user.create Dipicu saat akun pengguna dibuat.
providers/firebase.auth/eventTypes/user.delete Dipicu saat akun pengguna dihapus.

Pengguna dibuat

Akun Firebase memicu peristiwa pembuatan pengguna untuk fungsi Cloud Run saat:

  • Pengguna membuat akun email dan sandi.

  • Pengguna login untuk pertama kalinya menggunakan penyedia identitas gabungan.

  • Developer membuat akun menggunakan Firebase Admin SDK.

  • Pengguna login ke sesi autentikasi anonim baru untuk pertama kalinya.

Pengguna dihapus

Anda juga dapat mengonfigurasi fungsi untuk dipicu setelah penghapusan pengguna.

Struktur peristiwa

Data peristiwa disediakan sebagai objek UserRecord.

Contoh peristiwa pembuatan akun berbasis sandi ditampilkan di bawah:

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

Beberapa properti objek ini hanya ditentukan saat menggunakan metode autentikasi tertentu. Misalnya, peristiwa akun berbasis sandi menentukan properti email yang berisi alamat email pengguna. Properti uid (yang berisi ID pengguna unik untuk project Anda) selalu ditentukan.

Kode sampel

Node.js

/**
 * Background Function 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());
    }
  }
}

C#

using CloudNative.CloudEvents;
using Google.Cloud.Functions.Framework;
using Google.Events.Protobuf.Firebase.Auth.V1;
using Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;

namespace FirebaseAuth;

public class Function : ICloudEventFunction<AuthEventData>
{
    private readonly ILogger _logger;

    public Function(ILogger<Function> logger) =>
        _logger = logger;

    public Task HandleAsync(CloudEvent cloudEvent, AuthEventData data, CancellationToken cancellationToken)
    {
        _logger.LogInformation("Function triggered by change to user: {uid}", data.Uid);
        if (data.Metadata is UserMetadata metadata)
        {
            _logger.LogInformation("User created at: {created:s}", metadata.CreateTime.ToDateTimeOffset());
        }
        if (!string.IsNullOrEmpty(data.Email))
        {
            _logger.LogInformation("Email: {email}", data.Email);
        }

        // In this example, we don't need to perform any asynchronous operations, so the
        // method doesn't need to be declared async.
        return Task.CompletedTask;
    }
}

Ruby

require "functions_framework"

# Triggered by creation or deletion of a Firebase Auth user object.
FunctionsFramework.cloud_event "hello_auth" do |event|
  # Event-triggered Ruby functions receive a CloudEvents::Event::V1 object.
  # See https://cloudevents.github.io/sdk-ruby/latest/CloudEvents/Event/V1.html
  # The Firebase event payload can be obtained from the `data` field.
  payload = event.data

  logger.info "Function triggered by creation/deletion of user: #{payload['uid']}"
  logger.info "Created at: #{payload['metadata']['createdAt']}"
  logger.info "Email: #{payload['email']}" if payload.key? "email"
end

PHP


use Google\CloudFunctions\CloudEvent;

function firebaseAuth(CloudEvent $cloudevent)
{
    $log = fopen(getenv('LOGGER_OUTPUT') ?: 'php://stderr', 'wb');
    $data = $cloudevent->getData();

    fwrite(
        $log,
        'Function triggered by change to user: ' . $data['uid'] . PHP_EOL
    );
    fwrite($log, 'Created at: ' . $data['metadata']['createTime'] . PHP_EOL);

    if (isset($data['email'])) {
        fwrite($log, 'Email: ' . $data['email'] . PHP_EOL);
    }
}

Men-deploy fungsi Anda

Untuk men-deploy fungsi, Anda harus menentukan jenis peristiwa dan project yang Firebase Auth-nya sudah dikonfigurasi. Di Konsol Google Cloud, ada satu kolom untuk Jenis Peristiwa karena project tersebut dianggap sama dengan project yang berisi fungsi Anda.

Namun, pada command line, Anda harus menggunakan string yang spesifik untuk menentukan kedua parameter ini. Perintah gcloud berikut men-deploy fungsi yang dipicu oleh peristiwa create pengguna:

gcloud functions deploy FUNCTION_NAME \
  --no-gen2 \
  --entry-point ENTRY_POINT \
  --trigger-event providers/firebase.auth/eventTypes/user.create \
  --trigger-resource YOUR_PROJECT_ID \
  --runtime RUNTIME
Argumen Deskripsi
FUNCTION_NAME Nama Cloud Run yang terdaftar yang sedang Anda deploy. Ini dapat berupa nama fungsi dalam kode sumber Anda, atau string arbitrer. Jika FUNCTION_NAME adalah string arbitrer, Anda harus menyertakan flag --entry-point.
--entry-point ENTRY_POINT Nama fungsi atau class dalam kode sumber Anda. Opsional, kecuali jika Anda tidak menggunakan FUNCTION_NAME untuk menentukan fungsi dalam kode sumber yang akan dijalankan selama deployment. Dalam hal ini, Anda harus menggunakan --entry-point untuk memberikan nama fungsi yang dapat dieksekusi.
--trigger-event NAME Nama jenis peristiwa yang memicu fungsi. Dalam hal ini, opsinya harus berupa buat atau hapus, seperti yang tercantum di atas.
--trigger-resource NAME Project ID (dalam contoh ini, YOUR_PROJECT_ID) untuk project yang berisi fungsi Anda dan Firebase Authentication.
--runtime RUNTIME Nama runtime yang Anda gunakan. Untuk daftar lengkapnya, lihat referensi gcloud.