Ruby on rails FacebookOmniauth问题,RubyonRails设计
为了寻找答案,我在这几页上搜寻了好几个星期。我是Ruby的新手,我遵循了一个教程,能够顺利地完成它。我的问题是,我决定向我的应用程序添加更多功能,除了运行完美的Desive gem之外,还使用Omniauth gem通过Facebook验证用户 我几乎知道解决方案对训练有素的人来说很简单,但我不知所措,因为我在这个网站和其他网站上尝试了许多建议,并取得了不同程度的成功 我目前的问题是,每当用户尝试使用Facebook登录时,用户都会获得身份验证,但会被重定向到注册页面。上周某个时候我闲逛了一下,成功登录了,但只登录了一次,随后就被重定向到注册页面 因此,我需要的场景是: 如果用户单击“使用Facebook登录”链接,他们应该被重定向到Facebook进行身份验证,然后发送回我的Ruby应用程序,电子邮件、first_name、last_name的值应该添加到该用户的用户表中 对于返回的用户, 应检查所有数据库值,用户将自动登录,无需太多麻烦 我还想一个电子邮件唯一的约束,以确保我们没有多人使用同一封电子邮件 我真的很想知道我错在哪里。。就像我上面提到的,我是这个领域的新手,因为我主要从事IT基础设施的工作 请参阅下面我的代码: 回调\u controller.rbRuby on rails FacebookOmniauth问题,RubyonRails设计,ruby-on-rails,devise,omniauth-facebook,Ruby On Rails,Devise,Omniauth Facebook,为了寻找答案,我在这几页上搜寻了好几个星期。我是Ruby的新手,我遵循了一个教程,能够顺利地完成它。我的问题是,我决定向我的应用程序添加更多功能,除了运行完美的Desive gem之外,还使用Omniauth gem通过Facebook验证用户 我几乎知道解决方案对训练有素的人来说很简单,但我不知所措,因为我在这个网站和其他网站上尝试了许多建议,并取得了不同程度的成功 我目前的问题是,每当用户尝试使用Facebook登录时,用户都会获得身份验证,但会被重定向到注册页面。上周某个时候我闲逛了一下,
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