RailsとiOS(Swift)とAWS間をAPIモードで、データファイル保存呼び出しさせるまで①

### 前書き
初心者向けに自分なりの言葉で柔らかく書いたつもりです。非エンジニアですが、メモ目的とアウトプットの恩恵のために記事にしました。間違っているところなどありましたら、コメントをください。
あとコードにコメントが多く可読性が悪いかもしれません。そこは申し訳なく…

iosからAWSまでの一連の流れを記事にしているためかなり長くなっているので、記事を分けて書いています。

- [RailsとiOS(Swift)とAWS間をAPI通信で、データファイル保存させるまで②Alamofire、Swiftyjson編 devise_token_auth(認証)のデータの送受信](https://qiita.com/Rafflesia/items/a175a15a46c10d5a8609)
- [RailsとiOS(Swift)とAWS間をAPI通信で、データファイル保存させるまで③Alamofire、Swiftyjson編 apiモードを使ってdevise_token_auth(認証)以外のデータの送受信](https://qiita.com/Rafflesia/items/2fd37cd064aad7bd085f)
- [RailsとiOS(Swift)とAWS間をAPI通信で、データファイル保存させるまで④carrierwave編](https://qiita.com/Rafflesia/items/6cd5d6e25f15e1ba876f)

③までのものがこちら
https://github.com/ToruMizuno/railswiftapi
④までのものがこちら
https://github.com/ToruMizuno/railswiftapi2

# devise token auth編


## 参考記事

- [devise token auth を使って簡単に早くAPIを作る 1](http://clc.gonna.jp/2017/01/post-1306/)
- [【iOS】SwiftでRailsと連携する方法](https://qiita.com/SoyaTakahashi/items/4a40aefdf13417b1857f)



## プロジェクト実装


### プロジェクト作成

```:
$ rails new railswift --api
$ cd railswift
```





### gem編集

```gemfile:
# 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
```




### モデル編集

```Ruby: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で出来たマイグレーションファイルを編集

```Ruby:**************_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
```





### コントローラーの編集

```Ruby: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
```






### 上記のコントローラーアクションのルートの追加

```Ruby: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の設定

```Ruby: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までの一連の流れを記事にしているためかなり長くなってしまったので他の記事でも紹介しています。
こちらを続けてご覧下さい。

- [RailsとiOS(Swift)とAWS間をAPI通信で、データファイル保存させるまで②Alamofire、Swiftyjson編 devise_token_auth(認証)のデータの送受信](https://qiita.com/Rafflesia/items/a175a15a46c10d5a8609)