実装の背景
Railsだけのコードで作られた既存のアプリをRailsとReactにリプレースする。
既存のアプリでは認証機能にdevise
を用いたsession認証を使用。
これに対し、
リプレースする際にトークン認証が必要となりdevise_token_auth
を導入した。
#gemのインストール
gem 'devise'
gem 'devise_token_auth'
gem 'omniauth', '>= 1.0.0'
devise
は認可処理を行う場合、これがないとエラーが起こる可能性があるため入れている。
omniauth
はマイグレーションの際に、
Could not lord 'omniauth'. Please ensure you have the omniauth gem >= 1.0.0 installed and listed in your Gemfile.
というエラーが出たので、解消するために入れましたが
本来omniauth
はOauth2認証を入れたいならOmniAuth gemを活用する
ようです。
#devise_token_authの導入
rails g devise:install
rails g devise_token_auth:install User auth
すると、devise_token_auth
に関するファイルが自動生成される。
例)マイグレーションファイル
class DeviseTokenAuthCreateUsers < ActiveRecord::Migration[5.2]
def change
create_table(:users) do |t|
## Required
t.string :provider, :null => false, :default => "email"
t.string :uid, :null => false, :default => ""
## Database authenticatable
t.string :encrypted_password, :null => false, :default => ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
t.boolean :allow_password_change, :default => false
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Confirmable
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
# t.integer :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts
# t.string :unlock_token # Only if unlock strategy is :email or :both
# t.datetime :locked_at
## User Info
t.string :name
t.string :nickname
t.string :image
t.string :email
## Tokens
t.text :tokens
t.timestamps
end
add_index :users, :email, unique: true
add_index :users, [:uid, :provider], unique: true
add_index :users, :reset_password_token, unique: true
add_index :users, :confirmation_token, unique: true
# add_index :users, :unlock_token, unique: true
end
end
このままマイグレーションをするとエラーが発生する。
今回は開発途中からdevise_token_auth
を導入するということで
元々usersテーブルが存在するのにも関わらず
新しくusersテーブルを作ろうとしているからですね。
結論、devise_token_auth
に必要なカラムを現在のusersテーブルに追加します。
class AddDeviseTokenAuthToUsers < ActiveRecord::Migration[6.0]
def up
add_column :users, :provider, :string, :null => false, :default => "email"
add_column :users, :uid, :string, :null => false, :default => ""
add_column :users, :tokens, :text
end
def down
remove_column :users, :provider
remove_column :users, :uid
remove_column :users, :tokens
end
end
今回はこの3つのカラムを追加します。
自動で作られたマイグレーションファイルをこのように修正し
マイグレーションすると実行されます。
ここから先は、初めからdevise_token_auth
を導入する方法と流れは同じです。
補足
devise_token_auth
は導入後ルーティングさえ記述すれば基本的には
sessions_controller
やregistrations_controller
の作成は不要です。
ログインやアカウント登録後に初期のポイントを付与するなど
オプションを加えたいような時はそれぞれのコントローラーを作成しアクションを定義します。
その際はconfig/routes.rb
にてdevise_token_auth
のルーティングに
反映させたいコントローラーを指定します。
Rails.application.routes.draw do
### users/registrations_controller を反映させたい場合
mount_devise_token_auth_for 'User', at: 'user', controllers: {registrations: "users/registrations"}
.
.
.
end
参考資料