devise_token_authの設定について

## deviseとは

deviseは、Railsで簡単にログインやサインアップなどの認証機能を実装することができるgemの事です。

## devise_token_authとは

devise_token_authとは、トークン認証機能を実装することができるgemです。
例えば、ユーザーがログインした時にサーバー側でトークンが生成されてそれを、Headerに含めてユーザー側にレスポンスすることができます。

## devise_token_authの導入
まずは、必要なgemをGemfileに書いていきます。
```diff_ruby:Gemfile
+ gem 'devise'
+ gem 'devise_token_auth'
```
次に、gemをインストールします。
```
bundle install
```
インストールが完了したら、devise用のファイルを以下のコマンドで作成します。
```
rails g devise:install
```
```
rails g devise_token_auth:install User auth
```
上記のコマンドによりmigrationファイルの他、複数のファイルが作成、変更が行われました。特に変更はないので、マイグレーションしたいと思います。
```
rails db:migrate
```
上記のコマンドにより、`rails/db/schema.rb`に`usersテーブル`が作成されたと思います。

## devise_token_authの設定

まずは、作成された`config/initializers/devise_token_auth.rb`にdevise_token_authの設定をしていきます。

:::note info
以下のコードをコメントアウトしてください。
:::

```ruby:config/initializers/devise_token_auth.rb
DeviseTokenAuth.setup do |config|

  # リクエストごとにトークンを更新するか
  #　毎回更新されないようにするため、falseにします。
  config.change_headers_on_each_request = false

  # トークンの有効期間
  # 2週間の有効期限です(変更可能)
  config.token_lifespan = 2.weeks

  # ヘッダーの名前を定義
  config.headers_names = {:'access-token' => 'access-token',
                          :'client' => 'client',
                          :'expiry' => 'expiry',
                          :'uid' => 'uid',
                          :'token-type' => 'token-type' }
end
```
### ルーティングの設定
authディレクトリの中にあるregistrationsコントローラーでログインとサインアップ機能を行えるようにします。
```ruby:config/routes.rb
Rails.application.routes.draw do
    mount_devise_token_auth_for 'User', at: 'auth', controllers: {
    #authディレクトリにあるregistrationsコントローラーに設定
      registrations: 'auth/registrations'
    }
end
```
上記により、設定が完了しました。

### コントローラーの設定
最初にコントローラーを作成します。
```
rails g controller auth/registrations
```
`app/controllers/auth/registrations_controller.rb`という形で作成されていると思います。

次に、コントローラーの設定をします。
```ruby:app/controllers/auth/registrations_controller.rb
class Auth::RegistrationsController < DeviseTokenAuth::RegistrationsController

    private

    def sign_up_params
      #name,email,password,password_confirmationのみをキーとして許可する
      params.permit(:name, :email, :password, :password_confirmation)
    end
end
```

以上でコントローラーの設定が完了しました。

次は、CORSの設定にいきます。
## CORSの設定
### CORSとは
CORSとは、異なるオリジン間でのリソース共有を可能にするセキュリティ
の仕組みのことです。
つまり、クライアント側がサーバーサイドのデータにアクセスする時の制限や許可を管理したりします。

### CORSの導入
`rack-cors`というgemをインストールします。
```diff_ruby:Gemfile
+ gem 'rack-cors'
```
gemをインストールします。
```
bundle install
```
インストールが完了したら、`config/initializers/cors.rb`というファイルがあると思いますので、編集していきます。
```ruby:config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    # origins 'example.com'の部分を'*'に変更
    # '*' ですべてのHTTPリクエストを許可する設定
    origins '*'

    resource '*',
      headers: :any,

      # exposeの行を追加することで、ブラウザからアクセスできるヘッダー情報を指定します
      expose: ['access-token', 'expiry', 'token-type', 'uid', 'client'],
      # どのHTTPリクエストメソッドを許可するか指定
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end
```
上記の部分をコメントアウトして、変更を加えれば設定完了です。

:::note info
oroginsの設定について
例えばクライアント側のホスト名が`localhost:8000`の場合は、originsの箇所にorigins 'localhost:8000'と入れてください。
:::

devise_token_auth設定は、以上となります。

---
参考

https://qiita.com/tkht2401/items/08776bb276579663528b