GAミント至上主義

Web Monomaniacal Developer.

Firebase FunctionsでFirebase Authenticationの認証情報を使う

ユーザー側からFirebase Functionsの関数を実行する際、そのユーザーの認証情報を使って処理をしたい。
たとえば、決済とかで。最近はAmazon Primeビデオでエウレカセブンを見直してます。

最初HTTPリクエストにトークンなどをつけて、firebase-adminを使って自分で認証するのかと思ったら専用のがすでに用意されてた。
Firebase作ってる人すごい。

詳細はこのページ。アプリからとありデフォルト表示はiOSになってて焦ったけどWEBアプリも対応してる。
Call functions from your app  |  Firebase

関数のデプロイ

functions.https.onCallを使う。dataにはリクエストされたdata、context.authには認証情報などが入る。

const functions = require('firebase-functions')
exports.auhTest = functions.https.onCall((data, context) => {
  // context.authにいろいろ入ってるので使う(下記)
  // ログインしてない場合はcontext.auth === undefined
  // ほか使えそうなのはcontext.headersぐらいかも
  return {ok: 'ok'}
});

context.authをダンプしてみると下記のような感じだった。Firebase AuthのIDの他、メールアドレスなども入っている。
Firestoreに保存するにはこれだけあれば十分そう。

context.auth
{
	"uid": "{firebase authのuid}",
	"token": {
		"iss": "https://securetoken.google.com/{プロジェクト名}",
		"name": "なまえ",
		"picture": "{ユーザーのアバター画像のURL}",
		"aud": "{プロジェクト名}",
		"auth_time": 15345239,
		"user_id": "{firebase authのuid}",
		"sub": "{firebase authのuid}",
		"iat": 1541566511,
		"exp": 1541570111,
		"email": "{ユーザーのメールアドレス}",
		"email_verified": true,
		"firebase": {
			"identities": {
				"google.com": [
					"{GoogleのIDっぽい数字}"
				],
				"email": [
					"{ユーザーのメールアドレス}"
				]
			},
			"sign_in_provider": "google.com"
		},
		"uid": "{firebase authのuid}"
	}
}

呼び出し

Vue.jsのmethodsで作ったはこんな感じ。これをボタンとかに仕込んで実行した。
関数の実行URLはFirebase側で勝手に取ってくれる?ので設定はいらない。

// firebaseの初期設定は省略
methods : {
    authTest: function(){
      const auth = firebase.functions().httpsCallable('authTest')
      auth({text: 'test'}).then(function(result) {
        console.log(result)
      }).catch(err => {
        console.error(err)
      })
    }
}

ちょーべんり