思い付きで書くのでアドベントカレンダーに参加できなかった。。。
この記事の対象者
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