ラーメンを食べて生活したい

ラーメン好きの技術ブログ

Ruby on Railsでログインを実装した!(Devise未使用)

以前、Deviseを使ったログイン方法を書きましたが、今回は全く使わない方法を書きます。 ちなみに、Deviseを使った方法は簡単ですがいらない機能が出てしまうので結構めんどくさいですw

やり方

  • まず下記RubyGemを追加します。
gem 'omniauth'
gem 'omniauth-twitter'
  • /config/initializers/omniauth.rbを作成して、その中にAPIキーを入れましょう。 ここでは、APIトークンを参照しています。
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では、Twitterfacebookなどの連携先を示しています。 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'

久しぶりすぎて全然覚えてなかった・・・

参考

qiita.com