W.T.B

Rails(devise_token_auth)でログイン機能を実装する

devise_token_authとは

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

devise_token_authの導入

gemにライブラリを追加

gem 'device'
gem 'devise_token_auth', '~> 1.2', '>= 1.2.4'

gemをインストール

bundle install

インストールが完了したらdevice用のファイルを生成

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

userテーブルのマイグレーションファイルが出来上がるのでマイグレーション

※追加でカラムが必要な場合は任意で追加

rails db:migrate

devise_token_authの設定

devise_token_authの設定を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',
                          :'authorization' => 'authorization' 
               }
end

ルーティングの設定

認証用のルーティングを追加

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

コントローラーの設定


class Auth::RegistrationsController < DeviseTokenAuth::RegistrationsController
    def create
      user = User.create(sign_up_params)
    end

    private

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

CORSの導入

rack-corsというライブラリの追加

gem 'rack-cors'

gemをインストール

bundle install

ファイルの編集(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

ルートリストを確認し対応メソッドに処理を追加(ユーザー作成など)

rails routes

NestJSでもログイン認証機能を実装してみたけれどもJWTや認証処理追加や設定周りに時間がかかっていたのがRailsでdevice_token_authを使うと大枠の処理としては出来上がっている状態で初期設定が完了しているため一瞬で出来上がった。スタートアップ界隈でのスピード感が求められる開発だと需要が高いのはわかる気がする。今までGoやNode .jsでのAPI開発をメインでしていたけれどもRailsについても今後学んでいきいたいと思う。

まずはログイン認証付きの投稿アプリで全体像を掴んでいこう。