#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 }}