前書き
初心者向けに自分なりの言葉で柔らかく書いたつもりです。非エンジニアですが、メモ目的とアウトプットの恩恵のために記事にしました。間違っているところなどありましたら、コメントをください。
あとコードにコメントが多く可読性が悪いかもしれません。そこは申し訳なく…
iosからAWSまでの一連の流れを記事にしているためかなり長くなっているので、記事を分けて書いています。
- RailsとiOS(Swift)とAWS間をAPI通信で、データファイル保存させるまで②Alamofire、Swiftyjson編 devise_token_auth(認証)のデータの送受信
- RailsとiOS(Swift)とAWS間をAPI通信で、データファイル保存させるまで③Alamofire、Swiftyjson編 apiモードを使ってdevise_token_auth(認証)以外のデータの送受信
- RailsとiOS(Swift)とAWS間をAPI通信で、データファイル保存させるまで④carrierwave編
③までのものがこちら
https://github.com/ToruMizuno/railswiftapi
④までのものがこちら
https://github.com/ToruMizuno/railswiftapi2
devise token auth編
参考記事
プロジェクト実装
プロジェクト作成
$ rails new railswift --api
$ cd railswift
gem編集
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'# コメントを外す
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
gem 'rack-cors'# コメントを外す
###############################
# ユーザー認証をするために追加したgem
gem 'omniauth'
gem 'devise'
gem 'devise_token_auth'
###############################
gemをインストールする
$ bundle install
データベース作成
$ rake db:create
devise token auth の認証機能を作成
$ rails g devise_token_auth:install User auth
モデル編集
app/models/user.rb
class User < ActiveRecord::Base
# Include default devise modules.
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# :confirmable, :omniauthable
include DeviseTokenAuth::Concerns::User
end
devise_token_authで出来たマイグレーションファイルを編集
**************_devise_token_auth_create_users
class DeviseTokenAuthCreateUsers < ActiveRecord::Migration[5.0]
def change
create_table(:users) do |t|
# devise_token_authで変わっているところ①
## Required
t.string :provider, :null => false, :default => "email"
t.string :uid, :null => false, :default => ""
# devise_token_authで変わっているところ②
## Database authenticatable
t.string :encrypted_password, :null => false, :default => ""
## deviseでinstallしても出てくるところ
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## 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 :nicname
# t.string :image# carrierwaveでプロフィール画像を保存したい場合は必要、stringで作成
t.string :email# 必要
t.string :user_name# 追加
## Tokens
t.text :tokens
t.timestamps
end
add_index :users, :email, unique: true
add_index :users, [:uid, :provider], unique: true# devise_token_authで変わっているところ③
add_index :users, :reset_password_token, unique: true
# コメントにしておく(お好みで)
# add_index :users, :confirmation_token, unique: true
# add_index :users, :unlock_token, unique: true
end
end
テーブル作成
$ rake db:migrate
アカウント作成時の登録項目(パラメータ)の追加
デフォルトのサインアップを継承して、独自で登録できる項目を増やせるようにアクションを作成し、それを実行できるようにルートも追加する
ルートの確認で、
$ rake routes
このパスワードとアドレスだけで認証するデフォルトのルートから
cancel_user_registration GET /auth/cancel(.:format) devise_token_auth/registrations#cancel
new_user_registration GET /auth/sign_up(.:format) devise_token_auth/registrations#new
edit_user_registration GET /auth/edit(.:format) devise_token_auth/registrations#edit
user_registration PATCH /auth(.:format) devise_token_auth/registrations#update
PUT /auth(.:format) devise_token_auth/registrations#update
DELETE /auth(.:format) devise_token_auth/registrations#destroy
POST /auth(.:format) devise_token_auth/registrations#create
auth_validate_token GET /auth/validate_token(.:format) devise_token_auth/token_validations#validate_token
パスワードとアドレス以外も登録できるように新しくする。
cancel_api_user_registration GET /api/auth/cancel(.:format) api/auth/registrations#cancel
new_api_user_registration GET /api/auth/sign_up(.:format) api/auth/registrations#new
edit_api_user_registration GET /api/auth/edit(.:format) api/auth/registrations#edit
api_user_registration PATCH /api/auth(.:format) api/auth/registrations#update
PUT /api/auth(.:format) api/auth/registrations#update
DELETE /api/auth(.:format) api/auth/registrations#destroy
POST /api/auth(.:format) api/auth/registrations#create
api_auth_validate_token GET /api/auth/validate_token(.:format) devise_token_auth/token_validation
コントローラーを作成
$ rails g controller api/auth/registrations
コントローラーの編集
aap/controllers/api/auth/registrations_controller.rb
# 追加
module Api
module Auth
class RegistrationsController < DeviseTokenAuth::RegistrationsController
private
# nicnameやaddressなど新しく項目(パラメーター)を付け足せる(マイグレーションでカラムを付け足さないと使えない)
# DeviseTokenAuthでアカウント作成の際、必要となるパラメーターをここに定義
def sign_up_params
params.permit(:user_name, :email, :password, :password_confirmation)
end
# def create
# build_resource(sign_up_params)
# resource.skip_confirmation!
# end
# DeviseTokenAuthでアカウント情報の中でupdateできるものを定義
def account_update_params
params.permit(:user_name, :email)
end
end
end
end
上記のコントローラーアクションのルートの追加
config/routes.rb
Rails.application.routes.draw do
# コメントにする
# mount_devise_token_auth_for 'User', at: 'auth'
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
# 追加
namespace :api do
mount_devise_token_auth_for 'User', at: 'auth', controllers: {
registrations: 'api/auth/registrations'
}
end
end
その他の設定
initializeの設定
config/initializers/dvise_token_auth.rb
DeviseTokenAuth.setup do |config|
config.change_headers_on_each_request = false# tokenの使い回し出来るようにする
config.token_lifespan = 1.month# tokenの有効期限、短いとセキュリティーが良い
config.headers_names = {:'access-token' => 'access-token',
:'client' => 'client',
:'expiry' => 'expiry',
:'uid' => 'uid',
:'token-type' => 'token-type' }
end
Alamofire、Swiftyjson編
記事の初めにも記述しましたが、iosからAWSまでの一連の流れを記事にしているためかなり長くなってしまったので他の記事でも紹介しています。
こちらを続けてご覧下さい。