问题
Following the gem's tutorial exactly I still seem to be running into some issues. I first click the link to sign up via Facebook and get redirected to Facebook. I click okay and get brought back to my registration page. No new user is created. If I try to click the register link again it just refreshes the page with this in the address bar http://localhost:3000/register#_=_
. What am I doing wrong?
User Model
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :omniauthable, omniauth_providers: [:facebook]
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.first_name = auth.info.first_name
user.last_name = auth.info.last_name
end
end
Callback Controller
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"])
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?
else
session["devise.facebook_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
end
Console Code
Started GET "/auth/facebook/callback?code=AQCh2rckn0dMOKNggTQJEbx_LTMGjNrDdumTu_Ay9Cwr_87A2pro_gOgFtSa866DouLuj4kMLVMMPfR3amp_X6rNSlAwOQ51RXK053vxhtEyJNY8StcqiOVZ6YqpGmfg8Zsz8RIXQr2xRclPmW9j9o8fqg83CoFiH1j-e_YOOuyCaX6xkoVN1eC3kjWSezg_WFm3p6aXu_XYxw1-Jf2j3Ijqt4kR4ySLHfmauj1z9UUcy5HANMIjaRx84NiZHNdJq6fzuAT37y9cXvP5HawonBBA0bG7ejAk5AATBYJj-kTXdCR9673cQ55O4GbAw_LCzzy7_YgHkFR9S038tP68HnXm&state=d013067bc67bd4bff43b6ac77bea69f5b113858cb234452a" for ::1 at 2015-07-12 19:28:55 -0400
I, [2015-07-12T19:28:55.026584 #7266] INFO -- omniauth: (facebook) Callback phase initiated.
Processing by Users::OmniauthCallbacksController#facebook as HTML
Parameters: {"code"=>"AQCh2rckn0dMOKNggTQJEbx_LTMGjNrDdumTu_Ay9Cwr_87A2pro_gOgFtSa866DouLuj4kMLVMMPfR3amp_X6rNSlAwOQ51RXK053vxhtEyJNY8StcqiOVZ6YqpGmfg8Zsz8RIXQr2xRclPmW9j9o8fqg83CoFiH1j-e_YOOuyCaX6xkoVN1eC3kjWSezg_WFm3p6aXu_XYxw1-Jf2j3Ijqt4kR4ySLHfmauj1z9UUcy5HANMIjaRx84NiZHNdJq6fzuAT37y9cXvP5HawonBBA0bG7ejAk5AATBYJj-kTXdCR9673cQ55O4GbAw_LCzzy7_YgHkFR9S038tP68HnXm", "state"=>"d013067bc67bd4bff43b6ac77bea69f5b113858cb234452a"}
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."provider" = ? AND "users"."uid" = ? ORDER BY "users"."id" ASC LIMIT 1 [["provider", "facebook"], ["uid", "836028396465704"]]
(0.1ms) begin transaction
(0.0ms) rollback transaction
Redirected to http://localhost:3000/register
Completed 302 Found in 59ms (ActiveRecord: 0.2ms)
回答1:
Add this line to config/initializers/devise.rb
config.omniauth :facebook, "app id", "app secret", scope: 'email', info_fields: 'email'
There's a change in the new version of Facebook API, Introducing Graph API v2.4
Fewer default fields for faster performance: To help improve performance on mobile network connections, we've reduced the number of fields that the API returns by default. You should now use the ?fields=field1,field2 syntax to declare all the fields you want the API to return.
回答2:
If you are following devise's wiki page then the authentication is failing. In tge controller if the authentication fails it redirects to the registration path. Just like mohamed said but you should now add first_name and last_name to your info_fields So in config/initializers/devise.rb write this config.omniauth :facebook, "app id", "app secret", scope: 'email', info_fields: 'email,first_name,last_name'
来源:https://stackoverflow.com/questions/31373640/omniauth-facebook-redirects-to-registration-screen-instead-of-creating-user