#author("2018-07-06T14:20:17+09:00","default:wikiwriter","wikiwriter")
#author("2018-07-06T14:25:49+09:00","default:wikiwriter","wikiwriter")
&tag(Devise);
*目次 [#y675c824]
#contents
*関連ページ [#m3e8e98a]
-[[./最もシンプルな認証機能]]
-[[./Twitter認証]]

*参考情報 [#if438d33]
-[[[*Rails*] deviseの使い方 - Qiita:http://qiita.com/cigalecigales/items/73d7bd7ec59a001ccd74]]

*概要 [#jdf656fd]
-Railsに認証機能を組み込むためのモジュール

*組み込み [#y6cdd57a]

**Gemfileの編集 [#j205d9c7]
-Gemfileに以下のgemを追加する。
#pre{{
gem 'devise'
gem 'omniauth-twitter'
}}
-bundle install実行
 bundle install --path vendor/bundle

**Device関連ファイルの生成 [#k6c9c6dd]
-device関連ファイルを生成する
 bundle exec rails g devise:install
-以下が表示される
#pre{{
Running via Spring preloader in process 19921
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. If you are deploying on Heroku with Rails 3.2 only, you may want to set:

       config.assets.initialize_on_precompile = false

     On config/application.rb forcing your application to not access the DB
     or load models when precompiling your assets.

  5. You can copy Devise views (for customization) to your app by running:

       rails g devise:views

===============================================================================
}}
-1.確認メール送信のための設定。とりあえずdevelopment.rbに以下を追加する(本番だと変更しないといけないらしい)
 config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
-2.ルートの設定。config/routes.rbを修正。root_urlを設定済みの場合は不要
  root to: "home#index"
-3.メッセージ表示の設定。application.html.erbを修正。設定済みの場合は不要
  <p class="notice"><%= notice %></p>
  <p class="alert"><%= alert %></p>
-4.Herokuの場合。
-5.Devise関連のビューを変更するためにファイルを生成する。そのまま実行する
 bundle exec rails g devise:views

*最もシンプルな認証機能を生成する [#a6aab561]
-Twitter経由やらFacebook経由やらを試すまえに最も基本的なパスワードによる認証を試しておくと流れがつかみやすい。
-[[./最もシンプルな認証機能]]

*Twitter認証を利用してログイン [#z58c23a6]
-Twitterにログインしその情報をユーザーとして利用する。
-[[./Twitter認証]]

*特定のユーザーだけがログインできるページの作成 [#ve44c104]

**方法1: コントローラーに細工する [#c58d347e]
-Deviseでログインしたユーザーがcurrent_userに保存されている。これとパラメータのIDで指定されたユーザーを比較し、異なればどこか他にリダイレクトするというもの。[[ruby - Rails user profile page only accessible to correct user - Stack Overflow:https://stackoverflow.com/questions/36407790/rails-user-profile-page-only-accessible-to-correct-user]]
#pre{{
class UsersController < ApplicationController

    before_action :check_user

    private

    def check_user
      if current_user != @user
        redirect_to root_url, alert: "Sorry, This Profile belongs to someone else !"
      end
    end
end
}}

**方法2: authenticated [#f7de7759]
-routes.rbに記述する方法もあるらしい。[[Deviseのアクセス制限ではauthenticatedを使おう | 人と情報:https://www.tmp1024.com/programming/rails-devise-routes-authenticated]]
*トラブルシューティング [#v24d80b5]

**タイムアウト発生時に「true」と表示される [#ua9560ba]
-[[Timeoutable timeouts causing Rails to flash[:timedout] as "true" · Issue #1777 · plataformatec/devise:https://github.com/plataformatec/devise/issues/1777]]で議論されている現象か。
-エラーメッセージを表示しているヘルパーメソッド(flash_messagesなど)で:timeoutを除外すればよい?
 unless msg_type == :timedout

**ステージング環境で認証できない(undefined methodが表示される) [#l591b26f]
-development.rbやproduction.rbで以下のようにセットアップしている場合、staging.rbにも設定が必要。
#pre{{
Devise.setup do |config|
  config.omniauth :twitter, TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET
end
}}

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS