Railsアプリケーション用にDeviseとOmniAuthを構成する方法

前書き

ほとんどのRuby on Railsアプリケーションには、ユーザー登録と認証メカニズムが必要です。 これらをゼロから開発するには、多くの時間と労力が必要です。ありがたいことに、* Devise *があります。 Devise gemを使用すると、数分で本格的なユーザー認証システムをセットアップできます。

ただし、新しいアカウントを作成せずにユーザーがアプリケーションにアクセスできるようにすることで、ユーザーを満足させることができます。 既存のFacebook、Twitter、Amazon、またはDigitalOceanアカウントを使用して簡単にログインできます。 実際、一般的なOAuthサービスプロバイダーで認証をサポートできます。 OAuthサポートはOmniAuth gemによって提供されます。 このチュートリアルでは、DeviseとOmniAuthの両方を使用する単純なアプリケーションを作成します。

前提条件

始める前に、ホストにRVM、Ruby、およびRailsの最新バージョンがインストールされていることを確認してください。 そうでない場合は、こちらの指示に従ってください:https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-on-ubuntu-12-04-lts-precise- pangolin-with-rvm [RVMを使用したUbuntu 12.04 LTSにRuby on Railsをインストールする方法]

このチュートリアルは、Ruby 2.1.2およびRails 4.1.5でテストされています。

ステップ1-新しいRailsアプリケーションを作成する

すべてのRailsアプリケーションを別のディレクトリに置くことをお勧めします。

今すぐ作成する必要があります。

mkdir rails_apps
cd rails_apps

Railsコマンドの発行を開始する前に、RVM環境を初期化する必要があります。

このチュートリアルの実行中に休憩を取る場合は、ターミナルセッションを再起動するたびにこれを行うことを忘れないでください。

. ~/.rvm/scripts/rvm
rvm use ruby --default

新しいアプリケーション* myapp *を呼び出しましょう。 アプリケーションを作成したら、を使用してアプリケーションのベースディレクトリを入力します。

rails new myapp
cd myapp

注:すべてのRailsコマンドは、アプリケーションのディレクトリ内から実行する必要があります。この場合は〜/ rails_apps / myappです。

手順2-必要な宝石をGemfileに追加します

DeviseおよびOmniAuth gemが必要です。 さらに、サポートするOAuthサービスプロバイダーごとに個別のgemも必要です。 このチュートリアルでは、DigitalOceanを使用したログインをサポートするため、gemが必要です。

ファイル `+〜/ rails_apps / myapp / Gemfile +`の最後に次の行を追加します。 テキストエディタとして使用できます。

gem 'therubyracer'
gem 'devise'
gem 'omniauth'
gem 'omniauth-digitalocean'

他のプロバイダーをサポートするには、同様のgemが必要です。 たとえば、Facebookをサポートするには、が必要です。 参考までにそのような宝石をいくつかご紹介します。

  • Twitter-omniauth-twitter

  • Amazon-omniauth-amazon

  • Google-omniauth-google

  • Github-omniauth-github

新しく追加されたgemをインストールします。

bundle install

手順3-アプリケーションへの基本機能の追加

テスト用に、このアプリケーションにいくつかのページをすばやく追加しましょう。 最終的に、これらのページはログイン後にのみアクセス可能になります。

これにはRailsの足場機能を使用できます。 コマンドを使用して、モデルに関する詳細を指定するだけで、Railsは完全に機能するページを生成して、そのモデルでCRUD(作成、読み取り、更新、削除)操作を実行します。 つまり、関連するすべてのコントローラーとビューが、モデルファイルとともに生成されます。

rails g scaffold Product name:string price:integer description:text
rake db:migrate

次に、このアプリケーションのルートを定義する必要があります。

`〜/ rails_apps / myapp / config / routes.rb +`を編集し、 ` root 'products#index' +`という行を追加して、既存の行のすぐ下にアプリのルートを指定します。 コメントアウトされている行はすべて無視できます。 完了すると、ファイル内のアクティブな行は次のようになります。

Rails.application.routes.draw do
 resources :products

end

さあ、今すぐアプリケーションをテストしてください。 次を入力して開発サーバーを起動します。

rails s

ブラウザからローカルホストにアクセスします。 リモートで開発している場合は、* localhost *をドロップレットの適切なIPアドレスまたはドメインに置き換えてください。 * 3000 *は、開発サーバーのデフォルトのポート番号です。

今のところ、ログインは必要ありません。 [新しい製品]をクリックして、いくつかの製品を追加します。 アプリケーションが期待どおりに動作していることを確認したら、ターミナルに戻り、Ctrl + Cを押してサーバーを停止します。

ステップ4-装置のセットアップ

Devise認証サポートを追加するには、次のコマンドを入力します。

rails generate devise:install
rails generate devise User
rake db:migrate

これにより、サインインフォームとサインアップフォーム、および関連するすべてのロジックが追加されます。

このアプリには、ユーザーが自分自身を登録してログインできる基本認証システムがあります。 ただし、すべてのページにはまだ直接アクセスできます。 これを変更するには、 `+〜/ rails_apps / myapp / app / controllers / application_controller.rb +`を編集し、ページを提供する前に実行する必要があるアクションとして追加します。

class ApplicationController < ActionController::Base
 protect_from_forgery with: :exception

end

必要に応じて、コマンドで開発サーバーを再起動し、 `+ http://:3000 / +`にアクセスしてこれらの新しく追加されたページをチェックアウトできます(もう一度、独自のドメインまたはIPアドレスを使用します)。 次のようなページが表示されます。

image:https://assets.digitalocean.com/articles/Configure_Devise/1.jpg [サインインページ]

`+ http:// localhost:3000 / users / sign_up +`にアクセスして、新しいユーザーとして登録できます。

手順5-OmniAuthをサポートするためのユーザーモデルの更新

サーバーを再度起動した場合は、CTRL-Cで停止します。 Deviseが生成したモデルに呼び出される新しい列を追加します。

rails g migration AddColumnsToUsers provider uid
rake db:migrate

ステップ6-OAuthサービスプロバイダーからクライアントIDとクライアントシークレットを取得する

サービスプロバイダーのウェブサイトにアクセスし、そこでアプリケーションを登録します。 すべてのサービスプロバイダーには、異なる登録手順があります。 DigitalOceanについては、こちらのチュートリアルを参照してください:https://www.digitalocean.com/community/tutorials/how-to-use-oauth-authentication-with-digitalocean-as-a-user-or-developer [使用方法] DigitalOceanをユーザーまたは開発者として使用するOAuth認証]

登録プロセス中にコールバックURLを要求されます。 プロバイダーごとに個別のコールバックURLがあります。 いくつかの人気のあるサービスプロバイダーのコールバックURLは次のとおりです。

  • デジタルオーシャン:http://:3000 / users / auth / digitalocean / callback

  • Facebook:http://:3000 / users / auth / facebook / callback

  • Amazon:http://:3000 / users / auth / amazon / callback

  • Twitter:http://:3000 / users / auth / twitter / callback

  • Google:http://:3000 / users / auth / google / callback

  • localhost *を、ドロップレットに解決されるIPアドレスまたはドメインに置き換えてください。 登録プロセスの最後に、クライアントIDとクライアントシークレットが提供されます。 次の手順でこれらの値を使用します。

ステップ7-Devise Initializerの更新

`〜/ rails_apps / myapp / config / initializers / devise.rb +`を編集して、ファイルの一番下の ` end +`行の直前にクライアントIDとシークレットを追加します。 また、独自のサーバーの名前とユーザーを含むものにを更新することをお勧めします。 これらの2つの項目以外に他の変更を加える必要はありません。

編集後、ファイルは次のようになります(ファイルには多くのコメント行もあります)。

Devise.setup do |config|
 #Replace example.com with your own domain name
 config.mailer_sender =

 require 'devise/orm/active_record'
 config.case_insensitive_keys = [ :email ]
 config.strip_whitespace_keys = [ :email ]
 config.skip_session_storage = [:http_auth]
 config.stretches = Rails.env.test? ? 1 : 10
 config.reconfirmable = true
 config.expire_all_remember_me_on_sign_out = true
 config.password_length = 8..128
 config.reset_password_within = 6.hours
 config.sign_out_via = :delete

 #Add your ID and secret here
 #ID first, secret second

end

手順8-ユーザーモデルの更新

Deviseが生成したユーザーモデルを変更して、使用するサービスプロバイダーを指定する必要があります。 既存のリストに3つのアイテムを追加しています(*:omniauthable、:omniauth_providers ⇒ [:digitalocean] *。追加のコンマを忘れないでください!)。 また、認証後に利用可能な情報を抽出するための名前の新しいメソッドを作成します。

編集後、 `+〜/ rails_apps / myapp / app / models / user.rb +`は次のようになります。

class User < ActiveRecord::Base
 devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable,
    :omniauthable, :omniauth_providers => [:digitalocean]

 def self.from_omniauth(auth)
     where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
       user.provider = auth.provider
       user.uid = auth.uid
       user.email = auth.info.email
       user.password = Devise.friendly_token[0,20]
     end
 end
end

ファイルを保存してください。

ステップ9-コールバックURLを処理するコントローラーを追加する

最初に、 `+〜/ rails_apps / myapp / config / routes.rb +`を編集し、行を更新して、コールバックを処理するコントローラーの名前を指定します。 単に* callbacks *と呼びましょう。 ファイルは次のようになります(コメントセクションを除く)。

Rails.application.routes.draw do
 devise_for :users
 resources :products
 root 'products#index'
end

次に、新しいファイル「+〜/ rails_apps / myapp / app / controllers / callbacks_controller.rb +」を作成します。

次のコードを追加してください。

class CallbacksController < Devise::OmniauthCallbacksController
   def digitalocean
       @user = User.from_omniauth(request.env["omniauth.auth"])
       sign_in_and_redirect @user
   end
end

さらに多くのOAuthプロバイダーを使用している場合は、それぞれに個別のメソッドが必要です。 メソッドの名前はプロバイダーの名前と一致する必要があります。 たとえば、Facebookのサポートを追加するには、を使用してメソッドを定義します。

これで、アプリケーションの準備ができました。 サーバーを再度起動します。

rails s

ホームページにアクセスしてください。 ログイン機能をテストしているため、Chromeシークレットウィンドウなどのデータが保存されていないセッションでこれを行うことができます。 * Digitaloceanでサインイン*リンクが表示されます。 クリックして。 DigitalOceanのログインページにリダイレクトされるはずです。 ログインに成功すると、独自のアプリケーションにリダイレクトされ、製品ページが表示されます。

image:https://assets.digitalocean.com/articles/Configure_Devise/2.jpg [DigitalOceanでサインイン]

結論

これで、アプリ用の最新のユーザー認証システムができました。ユーザー認証システムでは、ユーザーはメールアドレス、ソーシャルネットワーキングアカウント、または他の一般的なサービスを使用してサインインできます。

このアプリをDropletで本番環境に持ち込むことに決めた場合は、こちらのチュートリアルを参照できます:https://www.digitalocean.com/community/tutorials/how-to-launch-your-ruby-on-rails- app-with-the-digitalocean-one-click-image [DigitalOceanワンクリック画像でRuby on Railsアプリを起動する方法]。 アプリを新しいドロップレットに追加する場合は、忘れずに手順6に戻って、実稼働サーバーのコールバックURLでDigitalOcean API設定を更新してください。

Related