Ruby on rails FacebookOmniauth问题,RubyonRails设计

Ruby on rails FacebookOmniauth问题,RubyonRails设计,ruby-on-rails,devise,omniauth-facebook,Ruby On Rails,Devise,Omniauth Facebook,为了寻找答案,我在这几页上搜寻了好几个星期。我是Ruby的新手,我遵循了一个教程,能够顺利地完成它。我的问题是,我决定向我的应用程序添加更多功能,除了运行完美的Desive gem之外,还使用Omniauth gem通过Facebook验证用户 我几乎知道解决方案对训练有素的人来说很简单,但我不知所措,因为我在这个网站和其他网站上尝试了许多建议,并取得了不同程度的成功 我目前的问题是,每当用户尝试使用Facebook登录时,用户都会获得身份验证,但会被重定向到注册页面。上周某个时候我闲逛了一下,

为了寻找答案,我在这几页上搜寻了好几个星期。我是Ruby的新手,我遵循了一个教程,能够顺利地完成它。我的问题是,我决定向我的应用程序添加更多功能,除了运行完美的Desive gem之外,还使用Omniauth gem通过Facebook验证用户

我几乎知道解决方案对训练有素的人来说很简单,但我不知所措,因为我在这个网站和其他网站上尝试了许多建议,并取得了不同程度的成功

我目前的问题是,每当用户尝试使用Facebook登录时,用户都会获得身份验证,但会被重定向到注册页面。上周某个时候我闲逛了一下,成功登录了,但只登录了一次,随后就被重定向到注册页面

因此,我需要的场景是:

如果用户单击“使用Facebook登录”链接,他们应该被重定向到Facebook进行身份验证,然后发送回我的Ruby应用程序,电子邮件、first_name、last_name的值应该添加到该用户的用户表中

对于返回的用户, 应检查所有数据库值,用户将自动登录,无需太多麻烦

我还想一个电子邮件唯一的约束,以确保我们没有多人使用同一封电子邮件

我真的很想知道我错在哪里。。就像我上面提到的,我是这个领域的新手,因为我主要从事IT基础设施的工作

请参阅下面我的代码:

回调\u controller.rb

 class CallbacksController < 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

def failure
  redirect_to root_path
end
控制台响应

 Started GET "/users/auth/facebook" for ::1 at 2017-06-13 14:02:29 +0100
 I, [2017-06-13T14:02:29.142018 #8385]  INFO -- omniauth: (facebook) Request 
 phase initiated.
 Started GET "/users/auth/facebook" for ::1 at 2017-06-13 14:02:29 +0100
 I, [2017-06-13T14:02:29.488425 #8385]  INFO -- omniauth: (facebook) Request 
 phase initiated.
 Started GET "/users/auth/facebook/callback
 code=AQAJ33qxsDJhSh2fKc8YH9YANZwK2BagO3fotR22iw3
 cOeTN5G2HSvXbOioiwaQmwrZB3EEZKZBWlBAK4c
 RVyddoG8oaeLQfEXjA0FPOvZtpw0XiuBGwOJIh7YaDSjt7O33Dn2mB7Vlu2YUaT-
 DxlY3ioOVhNx8ymCE6TMGJx0slL-NvMB8b52IHSheMvPYTcMAoj2WXPgrLK8aH0eox_
 7VbD8zaV0QFeJxqask3gaU4GTkGI50liO2SdF
 T9fyFVWTgfORNP0yhwoH3HNlMGIznqSqbRGB43d
 2qULNHglH6exDMCzgpyhD3Bmi2lxzcLc10"
  for ::1 at 2017-06-13 14:02:29 +0100
 I, [2017-06-13T14:02:29.731093 #8385]  INFO -- omniauth: (facebook) Callback 
 phase initiated.
 Processing by CallbacksController#facebook as HTML
 Parameters: 
 {"code"=>"AQAJ33qxsDJhSh2fKc8YH9YANZwK2BagO3
 fotR22iw3cOeTN5G2HSvXbOioiwaQmwrZB3EEZK
 ZBWlBAK4cRVyddoG8oaeLQfEXjA0FPOvZtpw0XiuBGwOJIh7YaDSjt7O33Dn2mB7Vlu2YUaT-
 DxlY3ioOVhNx8ymCE6TMGJx0slL-
 NvMB8b52IHSheMvPYTcMAoj2WXPgrLK8aH0eox_
 7VbD8zaV0QFeJxqask3gaU4GTkGI50liO2SdFT9fy
 FVWTgfORNP0yhwoH3HNlMGIznqSqbRGB43d2qULNHglH6exDMCzgpyhD3Bmi2lxzcLc10"}
  User Load (0.3ms)  SELECT  "users".* 
  FROM "users" WHERE "users"."email" IS NULL 
  ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
  (0.2ms)  begin transaction
  (0.1ms)  rollback transaction
  Redirected to http://localhost:3000/users/sign_up
  Completed 302 Found in 265ms (ActiveRecord: 0.6ms)
新控制台响应

  User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."provider" = ? 
  AND 
  "users"."uid" = ? ORDER BY "users"."id" ASC LIMIT ? [["provider", 
  "facebook"], ["uid", "104903843446146"], ["LIMIT", 1]] (0.1ms) begin 
  transaction (0.1ms) rollback transaction Redirected to 
  localhost:3000/users/sign_up
请尝试以下代码:

def facebook
    @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
模型
我刚刚尝试了上面的代码,得到了相同的响应。你在登录facebook后没有登录吗?没有。它只是重定向到注册页面。fb数据是否保存在db中?它在第一次工作时(几周前)就保存在db中。。。我试图复制,所以我重置了数据库,但从那时起我一直无法保存在数据库中。。所以答案是否定的
  User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."provider" = ? 
  AND 
  "users"."uid" = ? ORDER BY "users"."id" ASC LIMIT ? [["provider", 
  "facebook"], ["uid", "104903843446146"], ["LIMIT", 1]] (0.1ms) begin 
  transaction (0.1ms) rollback transaction Redirected to 
  localhost:3000/users/sign_up
def facebook
    @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
  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]
      end
    end