LoginSignup
0
0

More than 3 years have passed since last update.

firebase functionsのonCall呼出し時に認証する

Posted at

思い付きで書くのでアドベントカレンダーに参加できなかった。。。

この記事の対象者

onCallファンクションの中で認証が必要なDB操作等をしたい人向け。

ググっても出なかったので書き出します。

onCallの中では認証情報が渡されているのでuidを取り出してcustomTokenを作り認証すればOK!!

以下サンプルソース

web 側

バッチ実行ボタン等から呼ばれるclickHandler関数の中でfunctions.httpsCallableにfunctions側の関数名(ここでは'hoge')を渡して非同期で実行する

client.js
import firebase from 'firebase/app'
import 'firebase/auth'
import 'firebase/functions'
import firebaseConfig from './firebaseConfig'

const clickHandler = async () => {
  const hoge = functions.httpsCallable('hoge')
  const result = await hoge({ piyo: 'fuga' })
  alert(result.data)
}

cloud functions 側(サーバー側)の認証処理部分

※1 firebase-adminsdkのjsonを利用してadminの初期化を事前に済ませます
※2 onCallのcallbak関数の第2引数に認証情報などが含まれている
※3 uidからcustomTokenを作りsignInWithCustomTokenでログインさせる

functions/index.js
const functions = require('firebase-functions')

const firebase = require('firebase/app')
require('firebase/auth')
require('firebase/database')
const firebaseConfig = require('../firebaseConfig')
firebase.initializeApp(firebaseConfig)

// ※1 firebase-adminsdkのjsonを利用してadminの初期化を事前に済ませます
const admin = require("firebase-admin")
const serviceAccount = require('../firebase-adminsdk.xxx.json')
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: firebaseConfig.databaseURL
})

// ※2 onCallのcallbak関数の第2引数に認証情報などが含まれている
exports.hoge = functions.https.onCall(async (data, context) => {
  if (!context.auth) {
    return 'ログインしてください'
  }

  // ※3 uidからcustomTokenを作りsignInWithCustomTokenでログインさせる
  try {
    const token = await admin.auth().createCustomToken(context.auth.uid)
    await firebase.auth().signInWithCustomToken(token)
  } catch {
    return 'ログインしてください'
  }

  // db操作とかの処理

  return 'OK' // DB操作結果
}

以下設定ファイルなど

firebaseConfig.js
const firebaseConfig = {
  apiKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  authDomain: 'xxx.firebaseapp.com',
  databaseURL: 'https://xxx.firebaseio.com',
  projectId: 'xxx',
  storageBucket: 'xxx.appspot.com',
  messagingSenderId: 'yyyyyyyyyy',
  appId: 'zzzzzzzzzzzzzzzzzzzzz'
}

module.exports = firebaseConfig
0
0
0

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
0
0