# Firebase
# Functions
# 名称
下記の 2 つは微妙に違うみたい。
- Cloud Functions
gcloud
cli から操作する
- Cloud Functions for Firebase
firebase
cli から操作する
# セットアップ
firebase login
firebase init functions
firebase deploy
Node.js v8.* を使うなら、functions/package.json
に "engines": { "node": "8" }
を追加する
const functions = require('firebase-functions');
// ユーザの削除をトリガにする
exports.helloWorld = functions.auth.user().onDelete(user => {});
// http通信をトリガにする
exports.helloWorld2 = functions.https.onRequest(async (req, res) => {});
# cors を有効にする
const cors = require('cors')(); // invokeを忘れずに
exports.storeImage = functions.https.onRequest((request, response) => {
cors(request, response, async () => {
// do something
});
});
# Auth
# backend
yarn add firebase-admin
const firebaseAdmin = require('firebase-admin');
firebaseAdmin.initializeApp({
credential: firebaseAdmin.credential.cert({
projectId: '',
clientEmail: '',
private_key_id: '',
privateKey: JSON.parse(process.env.FIREBASE_PRIVATE_KEY),
}),
});
const result = await firebaseAdmin.auth().verifyIdToken(token);
const firebaseUserId = result.user_id;
# frontend
yarn add firebase
# 初期化
import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/storage';
firebase.initializeApp({
apiKey: '',
authDomain: '',
projectId: '',
storageBucket: '',
});
# ログイン
// login with google
const provider = new firebase.auth.GoogleAuthProvider();
provider.addScope('email');
await firebase.auth().signInWithRedirect(provider);
// login anonimously
const result = await firebase.auth().signInAnonymously();
# ユーザ情報の取得
// listen auth status change (必要に応じてunsubscribeを忘れずに)
const unsubscribe() = firebase.auth().onAuthStateChanged(user => {});
unsubscribe();
// get current user(初期ロード時などはUndefinedになる可能性あり)
var user = firebase.auth().currentUser;
# リダイレクト情報の取得
// handle redirect all time
const result = await firebase.auth().getRedirectResult();
if (!result.user) return;
const token = await firebase.auth().currentUser.getIdToken();
# gapi を使った手動でのログイン
gapi を使って取得した idToken を使う方法。匿名アカウントのアップグレードなどが必要な場合は、この方法をとる必要がある。
var credential = firebase.auth.GoogleAuthProvider.credential(ID_TOKEN);
// 既存アカウントに紐付ける
await firebase.auth().currentUser.linkAndRetrieveDataWithCredential(credential);
// ログインする
await firebase.auth().signInAndRetrieveDataWithCredential(credential);