質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

Twitter認証を、deviseを用いたomniauthで実装したいが、ログイン出来ない

受付中

回答 0

投稿

  • 評価
  • クリップ 2
  • VIEW 174

3dmagicball

score 6

現状

RailsでWebサイトを構築しており、
ユーザー認証システムで、deviseを用いております。

そこに、Twitter認証を連携させるべく、omniauthを使用を考えております。

Twitter側での登録などは完了したことで、
ユーザー情報自体はDBに格納されるものの、
その後のログインに失敗してしまいます。
(TOPページに遷移し、ログイン出来ていない状態です)

やりたいこと

devise,omniauthを用いたtwitter認証でのログインです。
何が原因で、ログイン出来ていないのか教えていただきたいです。

値について

binding.pryで検証したところ、
@userは値が代入されており、
current_userはnil となっている状態です。

※@userにはしっかりとprovider twitterとなったアカウントが登録されております。

また普通のdeviseログインでは、
@user,current_userともに値は代入されております。

以下ソースコード

該当箇所と思われる部分のソースコードを記載します

registrations_controller.rb

# frozen_string_literal: true
# frozen_string_literal: true

class Users::RegistrationsController < Devise::RegistrationsController
  # before_action :configure_sign_up_params, only: [:create]
  before_action :configure_account_update_params, only: [:update]
  before_action :configure_sign_up_params, only: [:create]

  # GET /resource/sign_up
  def new
    super
  end

  # POST /resource
  def create
      #bypass_sign_in()
      params[:user][:gender] = params[:user][:gender].to_i
      super
   #binding.pry
  end

  # GET /resource/edit
  def editheroku certs:auto
    super
  end

  # PUT /resource ここいじり中
  def update
    current_user.update_attributes(account_update_params)
    if current_user.save
      redirect_to root_path, notice: 'プロフィールを更新しました'
    else
      render "edit"
    end
  end

  # DELETE /resource
  def destroy
    super
  end

  # GET /resource/cancel
  # Forces the session data which is usually expired after sign
  # in to be expired now. This is useful if the user wants to
  # cancel oauth signing in/up in the middle of the process,
  # removing all OAuth session data.
  def cancel
    super
  end

  protected

  # If you have extra params to permit, append them to the sanitizer.
  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
  end

  # If you have extra params to permit, append them to the sanitizer.
  #編集するやつ
  def configure_account_update_params
     devise_parameter_sanitizer.permit(:account_update, keys: [:image,:birthday,:content,:email]) 
     devise_parameter_sanitizer.permit(:account_update, keys: [:attribute])
  end

  # The path used after sign up.
  def after_sign_up_path_for(resource)
    super(resource)
  end

  # The path used after sign up for inactive accounts.
  def after_inactive_sign_up_path_for(resource)
    super(resource)
  end

  #gender保存用
  def configure_sign_up_params
   devise_parameter_sanitizer.permit(:sign_up, keys: [:gender])
   devise_parameter_sanitizer.permit(:sign_up, keys: [:birthday])
   devise_parameter_sanitizer.permit(:sign_up, keys: [:content])
   devise_parameter_sanitizer.permit(:sign_up, keys: [:image])

  end

end


omniauth_callbacks_controller.rb

# frozen_string_literal: true

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    callback_from :facebook
  end

  def twitter
    callback_from :twitter
  end

  private

  def callback_from(provider)
    provider = provider.to_s

    #   # Facebook上でメール使用を許可しているかの分岐
    # if request.env['omniauth.auth'].info.email.blank?
    #   redirect_to '/users/auth/facebook?auth_type=rerequest&scope=email'
    # end

    @user = User.find_for_oauth(request.env['omniauth.auth'])
    binding.pry

    #ここでメールアドレスでの分岐が必要
    if @user.persisted?
      # こっちで進んでいる
      # flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: provider.capitalize)
      # sign_in_and_redirect @user, event: :authentication
      sign_in_and_redirect rooms_path, event: :authentication

    else
      session["devise.#{provider}_data"] = request.env['omniauth.auth'].except("extra")
      redirect_to new_user_registration_url
    end

  end

  def after_sign_in_path_for(resource)
  #リダイレクトしたいパス
  # @user
  root_path
  end

end

application_controller.rb

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

    #以下user-parameterで使用
  before_action :configure_permitted_parameters, if: :devise_controller?
  #before_action :set_current_user

  protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
      devise_parameter_sanitizer.permit(:account_update, keys: [:name])
    end

end
#require "message.rb"

class UsersController < ApplicationController
  #下のやつもしかしたら場所違うかも
  # twitter用ログインで一度消す
  before_action :authenticate_user!, only: [:show,:message_room_id]

  #before_action :message_params, only: [:show]

  def new
  end

  #ここからはdeviseとは別用で記載(eventsで使用)
  def index
    @users = User.paginate(page: params[:page])
  end

  def show
    @user = User.find(params[:id])
    #@events = @user.events.paginate(page: params[:page])
    @q = Event.ransack(params[:q])
    @events = @q.result(distinct: true).paginate(page: params[:page]).where(user_id: @user.id)

    #message用
    #ログインユーザー
    @currentUserEntry=Entry.where(user_id: current_user.id)
    #その画面のユーザー
    @userEntry=Entry.where(user_id: @user.id)

    if @user.id == current_user.id
    else

      @currentUserEntry.each do |cu|
        @userEntry.each do |u|
          if cu.room_id == u.room_id 
            @isRoom = true
            @roomId = cu.room_id
          end
        end
      end
      #初なら、部屋とエントリーを作る!
      if @isRoom
      else
        @room = Room.new
        @entry = Entry.new
      end
    end

  end


  #ここから3つはdevise用記載
  #絶対書いちゃだめ!!書くと上書きされてしまう!
  # def user_signed_in?
  # end

  # def current_user
  # end




    private

    #これでいいかな
    # def message_params
    #   params.require(:message).permit(:content,:from_id,:to_id,:room_id)
    # end

end

User.rb

class User < ApplicationRecord
  has_many :events, dependent: :destroy
  has_many :messages, dependent: :destroy
  has_many :entries, dependent: :destroy


  validate  :image_size


  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,:confirmable,
         :recoverable, :rememberable, :validatable, :omniauthable

  def feed
    #Event.where("user_id = ?")
    Event.where("user_id = @user.id")
  end

  #enumの定義 gender
  enum gender: {男性: 0,女性: 1}


  #画像のアップロード
  mount_uploader :image, ImageUploader

  # アップロードされた画像のサイズをバリデーションする
  def image_size
    if image.size > 20.megabytes
      errors.add(:image, "画像サイズが大きすぎます。20MB以内に変更してください")
    end
  end



  #twitter認証
  def self.find_for_oauth(auth)
    user = User.where(uid: auth.uid, provider: auth.provider).first

    unless user
    #実際にFBから引っ張ったユーザーを認識してる
      user = User.create(
        uid:      auth.uid,
        provider: auth.provider,
        email:   User.dummy_email(auth),
        name:  auth.info.name,
        password: Devise.friendly_token[0, 20],
        image:  auth.info.image
      )
    end

    user
  end

  private

  def self.dummy_email(auth)
    "#{auth.uid}-#{auth.provider}@example.com"
  end

end

_links.html.erb

<%- if controller_name != 'sessions' %>
  <%= link_to "既にアカウントがある方は", new_session_path(resource_name) %>
<% end %>

<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
  <%= link_to "新規登録はこちら", new_registration_path(resource_name),class: "forgot" %>
<% end %>

<%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
  <%= link_to "パスワードを忘れた方は", new_password_path(resource_name),class: "forgot" %>
<% end %>

<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
  <%= link_to "確認用メールを再送する", new_confirmation_path(resource_name),class: "forgot" %>
<% end %>

<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
  <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name),class: "forgot" %>
<% end %>

<%- if devise_mapping.omniauthable? %>
  <%- resource_class.omniauth_providers.each do |provider| %>
    <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider),class: "forgot" %>
  <% end %>
<% end %>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる