devise_token_authとは、トークン認証機能を実装することができるgemです。
例えば、ユーザーがログインした時にサーバー側でトークンが生成されてそれを、Headerに含めてユーザー側にレスポンスすることができます。
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の設定を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
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についても今後学んでいきいたいと思う。
まずはログイン認証付きの投稿アプリで全体像を掴んでいこう。