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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

1207閲覧

【Rails】Devise+OmniAuthを用いたTwitter認証でコールバック後にログインできない問題

退会済みユーザー

退会済みユーザー

総合スコア0

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

1グッド

0クリップ

投稿2020/03/13 08:57

編集2020/03/13 09:16

今回、はじめて質問させていただきます。
内容に不備等がございましたら、
大変恐れ入りますが、ご教示いただけますと幸いです。
どうぞよろしくお願いいたします。

前提・実現したいこと

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

s.k👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

いろいろ調べてみたところ、ログの通りですが、twitterAPIの場合、
「email: auth.info.email」ではnilが返ってきてしまうため登録ができないということでした。
代わりにメールアドレスをダミーに替えると無事ログインができました。

投稿2020/03/13 10:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問