👻

【Rails】Firebase Authでjwt認証

2023/06/18に公開

参考記事:
https://qiita.com/satopin/items/1900118e21abc2ba3ed8

上記の記事を参考にやってみたのでまとめておきます!

Redis-serverのインストール

内部でfirebase_id_tokenを使っているため
Redisをインストールする必要があるとのことなので
以下コマンドでインストールする。

$ sudo apt install redis-server

Redis-serverのインストール

jwt認証を簡単に行いたいため、以下をGemfileに追記して
firebase-auth-railsというgemを利用します。

Gemfile
gem 'firebase-auth-rails'

追記できたら以下コマンドを実行。

$ bundle install

プロジェクト設定

config/initializersの中に「firebase_id_token.rb」というファイルを作成して
Reidsとfirebaseプロジェクトの設定を行いたいため下記を記述する。

config/initializers/firebase_id_token.rb

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

FirebaseのTokenを保存するテーブルを作成

フロント側で取得したTokenをリクエストしてもらい
そのTokenを保存するテーブルを作成しておきます。

※フロント側の実装は別記事にて。

以下のコマンドでUserのモデルを作成

$ rails g model User

作製された「××××_create_users」というファイルを
以下のように修正する

××××_create_users
class CreateUsers < ActiveRecord::Migration[7.0]
  def change
    create_table :users do |t|
      t.string :password_digest
      t.string :email, default: ""
      t.string :uid, null: false, default: ""

      t.timestamps

      t.index :uid, unique: true  # 同じuidによる登録を防ぐ

    end
  end
end

出来たら下記コマンドを実行

$ rails db:migrate

ユーザー登録用のコントローラを実装

app/controllers/api/v1/auth/users_controller.rb
require_dependency 'api/v1/application_controller'
module Api
  module V1
    module Auth
      class UsersController < V1::ApplicationController
        skip_before_action :authenticate_user

        def index
          # ユーザー一覧を取り出す
          users = User.order(created_at: :desc)
          render json: { status: 'SUCCESS', message: 'Loaded users', data: users }
        end

        def create
          # ユーザーを作成する
          FirebaseIdToken::Certificates.request
          raise ArgumentError, 'BadRequest Parameter' if payload.blank?
          @user = User.find_or_initialize_by(uid: payload['sub']) do |user|
            user.email = payload['email']
          end
          if @user.save
            render json: @user, status: :ok
          else
            render json: @user.errors, status: :unprocessable_entity
          end
        end

        private

        def token
          params[:token] || token_from_request_headers
        end

        def payload
          @payload ||= FirebaseIdToken::Signature.verify token
        end
      end
    end
  end
end

Routeの追加

config/routes.rbを以下のように修正

config/routes.rb
Rails.application.routes.draw do
  namespace 'api' do
    namespace 'v1' do
      resources :time_logs # 紐づけしたいテーブル名
        namespace 'auth' do
          post 'users' => 'users#create' #追記箇所
        end
    end
  end
end

これでrails側の検証は完成。

Discussion