Tech

Firebaseでユーザー登録・削除時にslackのincoming webhookにメッセージを送信する

Firebase Authを使うときに登録・削除の通知をSlackに送りたいと思い実装してみたのでその手順を残します。
コードではのslackにuidを送信していますが、何を送信して良さそうかは調整・確認をお願いします。

方法と事前準備

登録時のイベントはfirebase functionsにイベントを受け取る関数を登録することで実現します。
Firebaseの中にslackとの連携する箇所がありますが、これはどうもcrash analyticsのイベントが起きたときに送ってくれるもので違いそうでした。
firebase auth slack とかで検索すると連携できそうな雰囲気で引っかかるので罠でした。

  1. firebase cli を npm install -g firebase-tools 等でインストールする
  2. firebase login
  3. firebase init functions
  4. firebase deploy --only functions

functionsの中身

javascript(commonjs)の中身になります。 slackWebhookUrl を適切なものに変更してください。

functionsは今はv1/v2の移行期にあるようですが、 20240901の時点ではv2に onCreateonDelete にあたるものがないようなので、v1の関数として作成しました。

const logger = require('firebase-functions/logger')
const functions = require('firebase-functions')
const admin = require('firebase-admin')

admin.initializeApp()

const slackWebhookUrl = '[PUT_YOUR_WEBHOOK_URL]'

exports.sendSlackNotificationOnUserSignup = functions.auth.user().onCreate(async (user) => {
  const message = {
    text: `User Registered: ${user.uid}`,
  }

  try {
    const response = await fetch(slackWebhookUrl, {
      method: 'post',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(message),
    })

    if (!response.ok) {
      throw new Error(`Error in Slack API response: ${response.statusText}`)
    }

    logger.log('Signup notification sent successfully')
  } catch (error) {
    logger.error('Error sending signup notification', error)
  }
})

exports.sendSlackNotificationOnUserDelete = functions.auth.user().onDelete(async (user) => {
  const message = {
    text: `User Deleted: ${user.uid}`,
  }

  try {
    const response = await fetch(slackWebhookUrl, {
      method: 'post',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(message),
    })

    if (!response.ok) {
      throw new Error(`Error in Slack API response: ${response.statusText}`)
    }

    logger.log('Delete notification sent successfully')
  } catch (error) {
    logger.error('Error sending delete notification', error)
  }
})

資料

share