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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

0回答

1221閲覧

devise omniauth-facebookでcallbackへformのパラメーターが引き継げない。

YRails

総合スコア13

Devise

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2019/03/26 11:24

前提・実現したいこと

Railsの開発で、deviseとomniauth-facebookのgemを利用して
facebookアカウントでのouthログインを実現させたいと思っております。
シンプルにfacebook outh でログインする方法は調べたので実装できるのですが、
開発しているwebアプリのアカウント新規作成に制約があって、頭を抱えております。

その制約ですが、アカウント新規作成時にラジオボタンを使ってアンケートをしています
(xxxに興味ありますか? はい・いいえ みたいなアンケートです)。
このアンケート結果がUserのカラムとなっていて(仮にカラム名:questionnaireとします)、validationになっています。

したがって、ラジオボタンのアンケートに回答している状態で「facebookでサインアップ」のボタンを押すという仕様にしたいと考えております。

<%= form_tag user_facebook_omniauth_authorize_path do %> <%= radio_button ・・・ <%= radio_button ・・・ <%= submit_tag "Facebookでサインアップ", class: "create_btn" %>

こんな感じのコード書き、omniauth_callbacks_controller.rbのfacebookアクションにパラメーターを渡し、
user.questionnaire = params[xxx] みたいな形で実装したいと考えています。

###問題点
試みましたが、どうやら期待しているparamsがuser_facebook_omniauth_authorize_pathまで
運ばれていないようです。

omniauth-facebookで使用するファイル

user.rb

class User < ApplicationRecord ・ ・ ・ #omniauth-callback def self.from_omniauth(auth) where(provider: auth.provider, uid: auth.uid).first_or_create do |user| user.email = auth.info.email user.password = Devise.friendly_token[0,20] user.name = auth.info.name # assuming the user model has a name # user.picture = auth.info.image # assuming the user model has an image # If you are using confirmable and the provider(s) you use validate emails, # uncomment the line below to skip the confirmation emails. user.skip_confirmation! end end end

omniauth_callbaks_controller.rb(binding.pry置いてdebug出来るようにしてます)

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController def facebook # You need to implement the method below in your model (e.g. app/models/user.rb) @user = User.from_omniauth(request.env["omniauth.auth"]) binding.pry if @user.persisted? sign_in_and_redirect @user, event: :authentication #this will throw if @user is not activated set_flash_message(:notice, :success, kind: "Facebook") if is_navigational_format? elsif @user.invalid? redirect_to facebook_signup_path else session["devise.facebook_data"] = request.env["omniauth.auth"] redirect_to new_user_registration_url end end def failure redirect_to root_path end end

試したこと

facebook アクションにbinding.pryを置いてデバックしてみると、該当するparamsはありませんでした。

debug

1[1] pry(#<Users::OmniauthCallbacksController>)> params 2=> <ActionController::Parameters {"code"=>"AQCRPlgUGFpl6PWveKxfioddk7CZZ5Du5XSgBI5durfGdg4IoqQLL6FK5Srb2wLN1PMt3pBlZqdJlxKtjS_iyktLzRvEbGz79Q6EJwB8dwq6e-_fBoWDKqmhuFs5j3HqDixi4esl8GPVvbJHAt_xWfxVyoCa7X-tN2eyNXabw79mGc3L3T-eoyWBIm5OuUiFuze48tVNf8bvShV5P87l4wkcqeWrwGt2u3S8jmXXMG2Jxr6JT_3_WCm-PllGuvMd6_i26bWLilJL7cl-uohJ9s8iWgq68Tdxarx-5gipX8WoWHPSH1BxM3fiIn4WNBwPUpVzhXpmx6QJ2GIo5_fOJzbb", "state"=>"42568dbcc6be05d2436f7b3f3d27cfa0ae834d55a8d64091", "controller"=>"users/omniauth_callbacks", "action"=>"facebook"} permitted: false

しかし、<%= form_tag user_facebook_omniauth_authorize_path do %>のパスを、
例えばroot_path などにしてみると、きちんと期待したパラメーターが運ばれていました。

この原因は何なのでしょうか?
deviseのcallbackでパラメーターを破棄しているのでしょうか?

また、formでパラメーターをfacebook callbackに渡すことは可能なのでしょうか??

補足情報(FW/ツールのバージョンなど)

ruby: 2.5.3
rails: 5.2.2
devise: 4.6.1
omniauth-facebook: 5.0.0

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

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

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

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

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

urbainleverrier

2019/03/26 18:29

FacebookSDKに何か良い機能があるかもしれませんが、railsでのみなら簡単なようで難しいと思います。 sessionとして一時的に情報を持たせることになるのでしょうが、omniauthの実装では、ボタンを押した際、middlewareでfacebookにリダイレクトされます。 ですから、このmiddlewareに到達する前にご自身で別のmiddlewareを実装し、セッションを持たせるか、facebookへのoauth2リダイレクト処理を独自のroutingを設けて実装するかといった手段が必要になると思います。 または、facebookのボタンのauthorize_pathを独自のroutingに設定し、sessionを保持した後、authorize_pathにredirectするというのも考えられますが、果たしてそれで良いのかどうかはわかりません。
YRails

2019/03/29 08:31

丁寧なご回答ありがとうございます。 sessionを保持してauthorize_pathにredirectするというのはなるほどと思いましたが、 実装はかなり難しそうなので、仕様を変更しvalidationを解くこととしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問