我花了最后一天试图解决这个问题,这让我发疯了。
昨晚,我在我的网站上使用 facebook 登录并检索基本用户信息。当我添加:scope => 'user_birthday'
到config/initializers/omniauth.rb
现在看起来像这样时,我的问题就开始了
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, "APP_ID", "APP_SECRET", :scope => 'user_birthday'
end
作为参考,我已经config.omniauth :facebook, "APP_ID", "APP_SECRET"
从config/initializers/devise.rb
我花了几个小时试图让它发挥作用,但最终不得不放弃。然后今天早上我再次运行它并且它起作用了。喜出望外,我试图添加另一个参数,:scope
但现在整个事情又被打破了。如果我删除它,我可以让它工作,:scope
但是当我把它放回去时,它每次都会失败(即使:scope => 'user_birthday'
就像我今天早上第一件事一样)。
为了找到问题,我把调试代码放进去omniauth_callbacks_controller.rb
,它现在看起来像:
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"])
puts "start before persist debug"
puts @user.birthday
puts @user.persisted?
puts "end before persist debug"
if @user.persisted?
puts "Start persisted debug"
puts request.env["omniauth.auth"]
puts "End debug"
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"]
puts "Start unpersisted debug"
puts request.env["omniauth.auth"]
puts "End debug"
redirect_to new_user_registration_url
end
end
end
此调试清楚地表明 facebook 正在返回必要的信息,但应用程序失败,因为.persisted?
返回 false,因此我被重定向到 new_user_registration 页面,该页面返回以下内容:-
NoMethodError in Devise::Registrations#new
Showing /home/action/workspace/cloudapp/app/views/devise/shared/_links.html.erb where line #23 raised:
undefined method `omniauth_authorize_path' for #<#<Class:0x007f3aeffff038>:0x007f3aefffdf08>
我一生都无法弄清楚为什么.persisted?
返回错误。我正在使用 Nitrous.io 进行 Heroku postgresql 数据库的开发。我通过运行确认数据库中没有用户
rails c
User.all
这将返回:
User Load (89.4ms) SELECT "users".* FROM "users"
=> #<ActiveRecord::Relation []>
我感觉问题models/user.rb
出在哪里,但我不知道如何调试它以查看它是否正在寻找用户,因此不坚持或尝试创建用户并失败。有谁知道调试这个的简单方法?
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.birthday = auth.extra.raw_info.birthday
# user.image = auth.info.image # assuming the user model has an image
end
end
我已经经历了大约 50 次,几乎要放弃了。
我唯一能想到的where(provider: auth.provider, uid: auth.uid)
就是返回一些东西(它不应该因为我的数据库是空的)。我的数据库之外的某个地方是否可能存在一个索引,这就是它正在搜索的内容?
拜托,为了我的理智,有人可以帮忙吗?如果您需要更多信息,我很乐意提供
编辑 1
刚刚尝试了以下方法,它的工作原理让我比以往任何时候都更加困惑:
- 在我使用该帐户进行测试时,从我的 Facebook 帐户中删除该应用程序
- 尝试使用 facebook 登录
:scope => 'user_birthday'
。Facebook 将寻求的权限列为your public profile and birthday
. 接受并返回到我的站点,但按照上述失败(即使信息肯定会被发回) - 删除
:scope => 'user_birthday'
并尝试再次使用 facebook 登录。定向到 facebook,其中列出了寻求的许可your public profile and email address
。接受并返回到现在可以工作的站点,并且还存储了用户生日并可以访问,因为我从上面的第 2 点获得了来自 facebook 的许可。
我现在完全不知所措