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

# 実装の背景
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.
```
というエラーが出たので、解消するために入れましたが
本来`omniauth`は`Oauth2認証を入れたいなら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
```

今回はこの３つのカラムを追加します。
自動で作られたマイグレーションファイルをこのように修正し
マイグレーションすると実行されます。

ここから先は、初めから`devise_token_auth`を導入する方法と流れは同じです。


# 補足
`devise_token_auth`は導入後ルーティングさえ記述すれば基本的には
`sessions_controller`や`registrations_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
```

# 参考資料
https://qiita.com/Masahiro_T/items/6bc49a625b437a7c2f45

https://qiita.com/kobayashiryou/items/821270631ba84ea00fcc