LoginSignup
0
1

More than 1 year has passed since last update.

[Rails] devise_token_authを開発途中から導入

Posted at

実装の背景

Railsだけのコードで作られた既存のアプリをRailsとReactにリプレースする。
既存のアプリでは認証機能にdeviseを用いたsession認証を使用。

これに対し、
リプレースする際にトークン認証が必要となりdevise_token_authを導入した。

gemのインストール

Gemfile
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.

というエラーが出たので、解消するために入れましたが
本来omniauthOauth2認証を入れたいならOmniAuth gemを活用するようです。

devise_token_authの導入

terminal
rails g devise:install
rails g devise_token_auth:install User auth

すると、devise_token_authに関するファイルが自動生成される。
例)マイグレーションファイル

db/migrate/~_devise_token_auth_create_users.rb
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テーブルに追加します。

db/migrate/~_devise_token_auth_create_users.rb
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_controllerregistrations_controllerの作成は不要です。

ログインやアカウント登録後に初期のポイントを付与するなど
オプションを加えたいような時はそれぞれのコントローラーを作成しアクションを定義します。
その際はconfig/routes.rbにてdevise_token_authのルーティングに
反映させたいコントローラーを指定します。

config/routes.rb
Rails.application.routes.draw do

                           ### users/registrations_controller を反映させたい場合
  mount_devise_token_auth_for 'User', at: 'user', controllers: {registrations: "users/registrations"}
 .
 .
 .
end

参考資料

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1