Ruby on Railsでログインを実装した!(Devise未使用)
以前、Deviseを使ったログイン方法を書きましたが、今回は全く使わない方法を書きます。 ちなみに、Deviseを使った方法は簡単ですがいらない機能が出てしまうので結構めんどくさいですw
やり方
- まず下記RubyGemを追加します。
gem 'omniauth' gem 'omniauth-twitter'
Rails.application.config.middleware.use OmniAuth::Builder do provider :twitter, `twitter_token`, `twitter_token_secret` end
- ログインのために、Userモデルを作成してください。
rails g model user provider:string uid:string user_name:string
ここのprovider
では、Twitterやfacebookなどの連携先を示しています。
uid
はその連携先の各個人のIDです。ちなみに、このIDでユーザを検索することができます。
- Userモデルを記述していきます。
/app/models/user.rb class User < ApplicationRecord def self.find_or_create_from_auth(auth) provider = auth[:provider] uid = auth[:uid] user_name = auth[:info][:user_name] self.find_or_create_by(provider: provider, uid: uid) do |user| user.user_name = user_name end end end
- ログイン用のコントローラーを作成します。
rails g controller sessions
- そして、コントローラーないを記述します。
class SessionsController < ApplicationController def create user = User.find_or_create_from_auth(request.env['omniauth.auth']) session[:user_id] = user.id flash[:notice] = "ユーザー認証が完了しました。" redirect_to root_path end def destroy reset_session flash[:notice] = "ログアウトしました。" redirect_to root_path end end
最後にヘルパーメソッドと、ルーティングを編集し完成です!
class ApplicationController < ActionController::Base protect_from_forgery with: :exception helper_method :current_user, :logged_in? private def current_user return unless session[:user_id] @current_user ||= User.find(session[:user_id]) end def logged_in? !!session[:user_id] end def authenticate return if logged_in? redirect_to root_path, alert: "ログインしてください" end end
get '/auth/:provider/callback', to: 'sessions#create' get '/logout', to: 'sessions#destroy'
久しぶりすぎて全然覚えてなかった・・・
参考