👻
【Rails】Firebase Authでjwt認証
参考記事:
上記の記事を参考にやってみたのでまとめておきます!
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