10
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Rails API】devise_token_auth実装〜Rspecテストまで【環境構築〜devise実装編】

Last updated at Posted at 2019-05-10

はじめに

あばうと

メモ書き記事なので環境構築から順に書きます。
一応わかりやすいようにコマンドやコードなどは省略とかなしに書くつもりです。
なのでほぼほぼコピペでいけちゃいそうな記事になるかもしれませんが、学習中の方はひとつひとつ噛み砕いて理解してください。
gemやコードの説明などは対象外とします。

やること

  • 環境構築
  • ログイン認証をdevise + devise_token_authで実装
  • CSRF対策し外部ツールからPOST送信確認
  • Rspecでのテスト

記事の完成データはこちら
https://github.com/daisuke131/devise_token_auth_rspec

アプリ作成〜起動確認

アプリ作成

$ rails new devise_token_auth_sample --skip-bundle -d mysql

ここでは、vendor/bundleにbundle installしたい為、初期bundle installをスキップしてSQLはMySQLを使用するように作成しています。

次にbundle installします。

$ bundle install --path vendor/bundle

mysql2のエラー出る場合は、

$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"

これでもダメなら教えてください。

DBcreateして起動確認します。

$ bundle exec rails db:create
$ bundle exec rails s

おっしゃです!

Rspec導入

導入だけ先にやっときます。
generateコマンドを流した時自動でRspecファイルを生成してくれるので、先に導入する癖をつけています。

gem追加

factory_bot_railsfaker はテストデータを作成するために必要なgemです。

group :development, :test do
# (中略) 
  gem "rspec-rails"
  gem "factory_bot_rails"
  gem "faker"
end

bundle installしたあと、Rspecの設定ファイルをインストール

$ bundle exec rails g rspec:install

.rspecファイルの修正

--require rails_helper
--format documentation

rails_helper.rb修正

require 'rspec/rails'の下辺りに記述

rails_helper.rb
Faker::Config.locale = :ja

RSpec.configure do |config|メソッド内に追記

rails_helper.rb
config.include FactoryBot::Syntax::Methods

devise実装

gem追加


gem "devise"
gem "devise_token_auth"
gem "rack-cors"

deviceの設定ファイルインストール

$ bundle exec rails g devise:install

device_token_authの設定ファイルインストール

$ bundle exec rails g devise_token_auth:install User auth

先にdeviseの設定ファイルを入れてからdevice_token_authの設定ファイルを入れないとめんどうなことになるので注意!

作成されたmigrationファイルに追記
コメントアウトで「## Trackable」と書いている部分

~~~~~~~_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

マイグレ!

$ bundle exec rails db:migrate

次はコントローラーを作っていくのですが、無駄なファイルを追加しないようにapplication.rbに次の記述を追加します。

config/application.rb
config.generators do |g|
  g.template_engine false
  g.javascripts false
  g.stylesheets false
  g.helper false
  g.test_framework :rspec,
  fixtures: true,
  fixture_replacement: :factory_bot,
  view_specs: false,
  routing_specs: false,
  helper_specs: false,
  controller_specs: false,
  request_specs: true
end
config.api_only = true
config.middleware.use ActionDispatch::Flash

追加場所がわからなかったらgitに上げているので参考にしてください。

コントローラの作成

$ bundle exec rails g controller api/v1/auth/registrations

app > controllers > api > v1 > auth > registrations_controller.rbにファイルが作成されたので↓のように書き換え。

registrations_controller.rb
class Api::V1::Auth::RegistrationsController < DeviseTokenAuth::RegistrationsController
  private
    def sign_up_params
      params.permit(:name, :email, :password, :password_confirmation)
    end

    def account_update_params
      params.permit(:name, :email)
    end
end

route.rbの修正
mount_devise_token_auth_for 'User', at: 'auth'をネストしてあげる。

route.rb
namespace :api do
  namespace :v1 do
    mount_devise_token_auth_for 'User', at: 'auth', controllers: {
      registrations: 'api/v1/auth/registrations'
    }
  end
end

devise実装完了

次は、外部ツールからユーザーのデータを保存できるかなどを確認します。
外部ツールで確認編

すぐテストいくならこちら
Rspecテスト編

10
13
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
10
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?