今回、はじめて質問させていただきます。
内容に不備等がございましたら、
大変恐れ入りますが、ご教示いただけますと幸いです。
どうぞよろしくお願いいたします。
前提・実現したいこと
Railsで認証+ログイン機能の実装をしています。
「Twitterでログイン」クリックすると、画面遷移してログインした状態を作りたいです。
発生している問題・エラーメッセージ
「Twitterでログイン」クリックで画面遷移するものの、ログインできず
新規登録画面(users/sign_up)に遷移してしまいます。
尚、「アプリと連携する」ボタンは正しく表示され、クリックすると上記の通りになります。
該当のソースコード
devise.rb (.envファイルにて設定済み)
Devise.setup do |config| config.omniauth :twitter, ENV['TW_APP_KEY'], ENV['TW_APP_SECRET'] end
models/user.rb
class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :confirmable, :omniauthable VALID_NAME_REGEX = /\A\w+\z/i.freeze validates :name, presence: true, length: { maximum: 20 }, format: { with: VALID_NAME_REGEX }, uniqueness: { case_sensitive: false } has_one_attached :image 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.name = (auth.provider == 'twitter' ? auth.info.nickname : auth.name) user.email = auth.info.email user.password = Devise.friendly_token[0, 20] # ランダムなパスワードを作成 end end end
routes.rb
Rails.application.routes.draw do devise_for :users, controllers: { registrations: 'users/registrations', passwords: 'users/passwords', omniauth_callbacks: 'users/omniauth_callbacks' } (省略) end
controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController def twitter @user = User.from_omniauth(request.env["omniauth.auth"]) if @user.persisted? sign_in_and_redirect @user, event: :authentication #this will throw if @user is not activated set_flash_message(:notice, :success, kind: "Twitter") if is_navigational_format? else session["devise.twitter_data"] = request.env["omniauth.auth"].except("extra") redirect_to new_user_registration_url end end def failure redirect_to root_path end end
views/devise/shared/_links.html.slim
(省略) - if devise_mapping.omniauthable? - resource_class.omniauth_providers.each do |provider| = link_to t('.sign_in_with_provider', provider: OmniAuth::Utils.camelize(provider)), user_twitter_omniauth_authorize_path, method: :post
Gemfile(Devise関連以外省略)
gem 'devise' gem 'dotenv-rails' gem 'omniauth' gem 'omniauth-rails_csrf_protection' gem 'omniauth-twitter'
mysql> desc users;
+------------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------------+--------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | email | varchar(255) | NO | UNI | | | | encrypted_password | varchar(255) | NO | | | | | reset_password_token | varchar(255) | YES | UNI | NULL | | | reset_password_sent_at | datetime | YES | | NULL | | | remember_created_at | datetime | YES | | NULL | | | confirmation_token | varchar(255) | YES | UNI | NULL | | | confirmed_at | datetime | YES | | NULL | | | confirmation_sent_at | datetime | YES | | NULL | | | unconfirmed_email | varchar(255) | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | | name | varchar(255) | NO | UNI | NULL | | | provider | varchar(255) | YES | | NULL | | | uid | varchar(255) | YES | | NULL | | +------------------------+--------------+------+-----+---------+----------------+
log
Started POST "/users/auth/twitter" for 192.168.144.1 at 2020-03-13 07:43:07 +0000 Cannot render console from 192.168.144.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 I, [2020-03-13T07:43:07.594894 #1] INFO -- omniauth: (twitter) Request phase initiated. Started GET "/users/auth/twitter/callback?oauth_token=cVGkcgAAAAABCaieAAABcNLYyoY&oauth_verifier=g6H2W9JhDn3XWtHMZ0SH4sfoT6HHgCHd" for 192.168.144.1 at 2020-03-13 07:43:09 +0000 Cannot render console from 192.168.144.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 I, [2020-03-13T07:43:09.519067 #1] INFO -- omniauth: (twitter) Callback phase initiated. Processing by Users::OmniauthCallbacksController#twitter as HTML Parameters: {"oauth_token"=>"cVGkcgAAAAABCaieAAABcNLYyoY", "oauth_verifier"=>"g6H2W9JhDn3XWtHMZ0SH4sfoT6HHgCHd"} User Load (0.9ms) SELECT `users`.* FROM `users` WHERE `users`.`provider` = 'twitter' AND `users`.`uid` = '12345678901234567890' ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/models/user.rb:22 (0.6ms) BEGIN ↳ app/models/user.rb:22 User Exists (0.9ms) SELECT 1 AS one FROM `users` WHERE `users`.`name` = 'abcdefg' LIMIT 1 ↳ app/models/user.rb:22 (0.5ms) ROLLBACK ↳ app/models/user.rb:22 Redirected to http://localhost:3000/users/sign_up Completed 302 Found in 172ms (ActiveRecord: 2.9ms)
試したこと
受け取る値でemailやpasswordを除外してみる、
user.name = auth.nameにしてみる、
サーバーの再起動、
db:migrate:reset実行、
Twitter側の連携OFF等を行いましたが、
どれも結果は変わらずでした、、
補足情報(FW/ツールのバージョンなど)
Rails: 5.2.4.1
Ruby: 2.5.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。