🔥

Firebase Auth + Rails + SPAで認証機能を作る

3 min read

はじめに

最近firebaseを用いた認証機能の実装を試してみたので、その過程と必要な要素についてまとめていきます。

手順としては以下の通りです。
今回はAPI側の実装なので、クライアント側でfirebaseを使用する部分は書いていません。
また、Railsでの開発が既にされている中にJWT認証を導入するとします。

1. firebase-auth-railsの導入
2. Redisのセットアップ
3. firebase_id_token.rbの作成
4. firebase_uidを保存するカラム追加のmigrationファイル作成
5. コントローラーへの記述

基本的にはfirebase-auth-railsのgithubを参照しながら進めていきます。

https://github.com/penguinwokrs/firebase-auth-rails

firebase-auth-railsの導入

今回はfirebase-auth-railsというGemを利用してJWT認証を実装していきます。
Gemfileに以下の記述をします。

Gemfile
gem 'firebase-auth-rails'

gemをインストールします。

$ bundle install

Redisのセットアップ

firebase-auth-railsは処理内でredisが要ります(firebase_id_tokenというgemを使用しているからだと思われます)ので、redisのインストールが必要です。

今回はdockerでredisを導入していきます。

docker-compose
redis:
    image: "redis:5.0.5"
    ports:
      - "6379:6379"
    command: redis-server
    volumes:
      - "./data/redis:/data"
api:
    environment:
      REDIS_URL: redis://redis:6379/0 # redisとの接続に必要

注意点としてはRailsとRedisを接続するためにREDIS_URLを記述する必要があるということです。

https://stackoverflow.com/questions/48802444/rails-docker-sidekiq-error-connecting-to-redis-on-127-0-0-16379-errnoe

However, there are some issues using localhost with docker in development, which is why the rails server is bound to 0.0.0.0. Thus, we need to specify with an env variable the specific address of where sidekiq can connect to redis

firebase_id_token.rbの作成

前述の通りfirebase-auth-railsではfirebase_id_tokenを使用しています。
そこでfirebase_id_tokenのinitializerを作成していきます。

config/initializers/firebase_id_token
FirebaseIdToken.configure do |config|
  config.redis = Redis.new
  config.project_ids = ['firebase_project_id']
end

この記述だけでセットアップ完了です。

firebase_uidを保存するカラム追加のmigrationファイル作成

firebase上に保存してあるuserのuidとDBに保存してあるuidを照合させる必要があります。
よってuserにuidのカラムを追加していきます。

$ rails g migration AddFirebaseUidToUsers uid:string
class AddFirebaseUidToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :uid, :string
  end
end
$ rails db:migrate

これでuidを保存するためのカラム追加完了です。

セットアップの最後にrails consoleで以下のコマンドを実行してGoogleのx509証明書を取得します(JWT認証を動かすために必要)

FirebaseIdToken::Certificates.request

https://github.com/fschuindt/firebase_id_token

Before verifying tokens, you need to download Google's x509 certificates.
To do it simply:
FirebaseIdToken::Certificates.request

コントローラーへの記述

firebaseの認証を走らせるためにapplication_controllerにfirebase_authを使う記述をしていきます。

application_controller
class ApplicationController < ActionController::API
  include Firebase::Auth::Authenticable
  before_action :authenticate_user # authenticate_xxx にすることでuser以外でも認証可能
end

このコントローラーを継承することで各アクションの前に認証が走り、current_userが取得できるようになります。

終わりに

firebaseを使用することで簡単にJWT認証が実装できました。
最後に認証の流れをまとめておきます。

1. クライアントからfirebaseにemailとpasswordを投げる
2. firebase上に一致する情報を持つuserがいるならfirebaseはトークンを返す
3. 受け取ったトークンをリクエストヘッダに含んでRails側にリクエストを投げる
4. Railsは渡されたトークンからJWT認証を行い、firebaseからuserのuidを受け取る
5. 受け取ったuidとDBに保管されたuidを照合して一致するuserを返す(current_user)

Discussion

ログインするとコメントできます