思い付きで書くのでアドベントカレンダーに参加できなかった。。。
この記事の対象者
onCallファンクションの中で認証が必要なDB操作等をしたい人向け。
ググっても出なかったので書き出します。
onCallの中では認証情報が渡されているのでuidを取り出してcustomTokenを作り認証すればOK!!
以下サンプルソース
web 側
バッチ実行ボタン等から呼ばれるclickHandler関数の中でfunctions.httpsCallableにfunctions側の関数名(ここでは'hoge')を渡して非同期で実行する
client.js
importfirebasefrom'firebase/app'import'firebase/auth'import'firebase/functions'importfirebaseConfigfrom'./firebaseConfig'constclickHandler=async()=>{consthoge=functions.httpsCallable('hoge')constresult=awaithoge({piyo:'fuga'})alert(result.data)}
cloud functions 側(サーバー側)の認証処理部分
※1 firebase-adminsdkのjsonを利用してadminの初期化を事前に済ませます
※2 onCallのcallbak関数の第2引数に認証情報などが含まれている
※3 uidからcustomTokenを作りsignInWithCustomTokenでログインさせる
functions/index.js
constfunctions=require('firebase-functions')constfirebase=require('firebase/app')require('firebase/auth')require('firebase/database')constfirebaseConfig=require('../firebaseConfig')firebase.initializeApp(firebaseConfig)// ※1 firebase-adminsdkのjsonを利用してadminの初期化を事前に済ませますconstadmin=require("firebase-admin")constserviceAccount=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{consttoken=awaitadmin.auth().createCustomToken(context.auth.uid)awaitfirebase.auth().signInWithCustomToken(token)}catch{return'ログインしてください'}// db操作とかの処理return'OK'// DB操作結果}
以下設定ファイルなど
firebaseConfig.js
constfirebaseConfig={apiKey:'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',authDomain:'xxx.firebaseapp.com',databaseURL:'https://xxx.firebaseio.com',projectId:'xxx',storageBucket:'xxx.appspot.com',messagingSenderId:'yyyyyyyyyy',appId:'zzzzzzzzzzzzzzzzzzzzz'}module.exports=firebaseConfig