外部システムで認証したユーザをログイン操作を行わせず Firebase の認証をさせてみた

本投稿は TECOTEC Advent Calendar 2020 の8日目の記事です。


こんにちは、テコテック開発者ブログをご覧いただきありがとうございます。
ブロックチェーン事業部の佐野です。

今回は外部システムで認証したユーザをログイン操作を行わせず Firebase の認証を行った記録となります。


はじめに

Firebase の認証を行うことでデータベースへの操作や閲覧ページの表示等をユーザ毎の権限に基づき制御可能となります。
もし認証を行わないと、全ての機能を匿名アクセス可能とすることになりセキュリティが低下しています。

しかし外部で認証済みのユーザに再度ログインをさせるのは… システム的にイケてないですね…
Firebase には JSON Web Token(JWT)を使用したユーザーまたはデバイスの認証が用意されていますのでこちらを利用します。

カスタムトークンを作成

ユーザー名やパスワードなどのログイン認証情報を受け入れて、その認証情報(外部システムでの認証)が有効であればカスタムトークン(カスタム JWT)を返す Cloud Function を作成し admin.auth().createCustomToken をコールします。

module.exports = functions.https.onCall(async ({ user_id }, context) => {
  try {
    const customToken = await admin.auth().createCustomToken(data.user_id) // ここでカスタムトークンを作成
    return customToken
  } catch (error) {
    throw new functions.https.HttpsError('aborted', error.message)
  }
})

この処理はサーバサイドでしか行うことができません。Cloud Function を作成するようにしましょう。

カスタムトークンを利用しログイン

クライアントサイドでカスタムトークンを取得し、Firebase の認証を行います。

await 外部システムでの認証(uid, pwd).then(result => { // uid: ユーザID, pwd: パスワード
  const createCustomToken = firebase.functions().httpsCallable('createCustomToken', options) // createCustomToken: Cloud Functionの登録名
  const customToken = await createCustomToken({ user_id: uid }) // uid: ユーザID
  await firebase.auth().signInWithCustomToken(customToken.data) // Firebaseの認証
})

これで Firebase の認証が行われます。カスタムトークンを取得し signInWithCustomToken をコールするだけです。

初めてアクセスしたユーザIDの場合は自動的に Firebase の Authentication の Users に User UID が登録および認証されます。既存のユーザの場合は認証されます。

認証するユーザIDには、外部システムでのユーザIDを設定することにより、外部システムと同じユーザIDを利用することができ、ユーザを特定することが出来るようになるため、ユーザ毎にデータベースへのアクセス等を制御出来るように作り込みが可能となります。

さいごに

たったこれだけで、外部システムでの認証と連携できるようになります。簡単ですね。
既存システムと Firebase で連携が必要になった場合は是非お試しください。


参考:カスタム トークンを作成する  -  Firebase


www.tecotec.co.jp