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

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

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

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

Twitter

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

Ruby on Rails

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

Q&A

解決済

1回答

4376閲覧

Devise内でomniauthのtwitter認証が完了してもレコードが格納されない

hikaru923

総合スコア27

Devise

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

Twitter

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

Ruby on Rails

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

0グッド

1クリップ

投稿2017/02/21 14:15

編集2017/02/22 01:11

###前提・実現したいこと

///0222追記
すみません!そもそも「実現したい事」を書くのを忘れていました!
エラーは後述の通り「Twitter認証後データがテーブルに格納されない」ことなのですが、それを回避して
僕が意図している
「Twitter認証をして、そこから取ってきたデータをテーブル内のレコードとして格納する」事が目的です。

///以下本文
ruby on railsを用い(この表現も正確か分かりません)自分でwebページを作ってみたいと思っております。
0から作るのではなく、
Ruby on Rails チュートリアルを全行程終わらせた成果物をブラッシュアップしていく、という形です。

現在、deviseを用いてログイン機能を実装しまして
Twitterやfacebookでの認証も追加したいと思いまして
こちらの記事 [Rails] deviseの使い方 - Qiita
を読み、上から一つずつ進めていっています。
既にID/Passでの認証などは終わらせているので、適宜「これは既に書いた」というコードは無視して進めています。

参考にさせていただいたリファレンスにおんぶにだっこなのですが
当該記事の「アカウント登録確認メールを送る」内の「メールが実際に届くようにする」までを実装したのですが
メールが届いて無事Twitter認証も終わり!と肩の力を抜きました。

###発生している問題・エラーメッセージ
ところが、ログアウト後、再度「Sign in with Twitter」を押しましたところ
Twitter側で「アプリケーションに戻ります。」というメッセージが表示され
無事認証されているなと思いきや
自サイトに戻ってきた時、アカウント登録画面に遷移してしまいます。
エラーメッセージが発生しないのでやや時間が掛かりましたが
これはどうも「twitter認証が完了した後もテーブルにデータが作成されない」から?だという事が分かりました。
前述の記事を参照させていただき、「user」部分をstudentに変え
当該studentモデル内にself.from_omniauthとself.new_with_sessionを記載しているのですが…

# app/models/student.rb class Student < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable, :omniauthable, omniauth_providers: [:twitter,:facebook] def self.from_omniauth(auth) where(provider: auth["provider"], uid: auth["uid"]).first_or_create do |student| student.provider = auth["provider"] student.uid = auth["uid"] student.studentname = auth["info"]["nickname"] end end def self.new_with_session(params, session) if session["devise.student_attributes"] new(session["devise.student_attributes"], without_protection: true) do |student| student.attributes = params student.valid? end else super end end end

ちなみに自サイトは2種類のユーザー種別がありまして、その両方にdeviseを設定しており
そのうちstudentユーザーにのみtwitter認証を実装しようとしています。
そのため一つのモデルより各種deviseのviewやcontrollerなどが複雑な構造になっています。
なので読み込むべきファイルではないものを参照しているのかな…とも思いましたが、
どこから手を付けたらいいのか判断できかねるので質問させていただきました。

###謝辞
問題解決にあたり、何か必要な情報などありましたら遠慮なくお申し付けください。随時追加させていただきます!
長文になりましたが、ここまで目を通していただき誠にありがとうございました。
何卒、お力添えをよろしくお願い申し上げます。

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

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

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

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

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

guest

回答1

0

自己解決

Devise+OmniAuthでユーザ認証を実装する手順 - Qiita

こちらに沿ってコーディングする事で無事登録されました!
ただリファレンスを紹介するだけになってしまっているような…すみません。
一つだけ工夫した点があるとすれば、外部サイトを用いた認証には
仮登録メールを介さずに即時登録となるようにしました。
(以下コードは敬意を込めて引用サイトから転載、1行コード追記)

ruby

1class User < ActiveRecord::Base 2 # ... 3 4 def self.find_for_oauth(auth) 5 user = User.where(uid: auth.uid, provider: auth.provider).first 6 7 unless user 8 user = User.create( 9 uid: auth.uid, 10 provider: auth.provider, 11 email: User.dummy_email(auth), 12 password: Devise.friendly_token[0, 20] 13 ) 14 end 15######これを追記!###### 16user.skip_confirmation! 17####################### 18 user 19 end 20 21 private 22 23 def self.dummy_email(auth) 24 "#{auth.uid}-#{auth.provider}@example.com" 25 end 26end

投稿2017/02/22 03:11

hikaru923

総合スコア27

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問