【问题标题】:omniauth-facebook gem: request.env["omniauth.auth"] is nilomn​​iauth-facebook gem:request.env["omniauth.auth"] 为 nil
【发布时间】:2017-04-14 04:18:06
【问题描述】:

我将omniauth-facebook gemdevise 一起使用。它一直工作到最近。我最近还从 Rails 4 升级到 Rails 5.0.1,但我不确定是不是这个原因。

我目前有 0 个用户,并且我已登录 Facebook。但是当我尝试在本地主机上使用 Facebook 注册我的应用时,我收到了这个错误:

NoMethodError in RegistrationsController#facebook
undefined method `provider' for nil:NilClass

这是我的用户模型。我标记了错误突出显示的行。

用户.rb

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable,
         :omniauthable, :omniauth_providers => [:facebook]


  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| #ERROR
      @data = auth.info
      user.name = @data.name
      # ...
    end
  end

RegistrationsController

  def facebook
    @user = User.from_omniauth(request.env["omniauth.auth"])
    if @user.persisted?
      sign_in_and_redirect @user, :event => :authentication
      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

另外,这是我的链接:

<%= link_to "fb", user_facebook_omniauth_callback_path(:facebook, thing: @thing.id, degree: @degree, :format => :js) %>

HTML 输出:

<a href=\"/auth/facebook/callback.js?thing=2\">fb<\/a>

还有路径:

localhost:3000/auth/facebook/callback.js?thing=2

所以问题是 request.env["omniauth.auth"] 出于某种原因为零。我在任何文档中都找不到任何类似错误的痕迹。

有人遇到过这种情况或有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails facebook devise omniauth omniauth-facebook


    【解决方案1】:

    要通过 facebook 进行身份验证,您只需将一个链接从您的网站链接到 facebook,如下所示:

    www.yoursite.com/auth/facebook
    

    然后设置一个路由来接收来自 Facebook 的带有身份验证哈希的回调:

    #routes.rb      
    get 'auth/facebook/callback'  => 'sessions#create_facebook'
    

    你能具体说明这一行的输出是什么样子或者你为什么要传递其他信息吗?:

    <%= link_to "fb", user_facebook_omniauth_callback_path(:facebook, thing: @thing.id, degree: @degree, :format => :js) %>
    

    编辑

    auth/facebook/callback 是一个获取请求。 Facebook 会在那里向您发送用户身份验证哈希。只有 facebook 本身应该使用这条路线。当你想验证你的链接必须是:

    localhost:3000/auth/facebook
    

    按照您的方式,omniauth 期待 facebook 的身份验证哈希,但收到“?thing=2”,导致身份验证失败。 Omniauth 尝试从不是哈希的“?thing=2”中提取信息,当您尝试访问 auth[provider] 时,auth 为空,因此未定义提供者,这会导致:

    undefined method `provider' for nil:NilClass
    

    【讨论】:

    • 我添加了我的 erb 链接的 HTML 输出和路径。其他参数只是为注册路径添加额外的数据。您的解决方案是否在omniauth-facebook 上运行?
    • 您的链接有误。 auth/facebook/callback 是为 facebook 保留的。 Facebook 发布到该路线,您不会将信息传递到该路线。我更新了我的答案。
    • 那么在使用 Facebook 创建新用户时是否可以传递额外的参数?
    • 是的,但是在您的 omniauth.rb 文件中或作为参数,您可以在 facebook-omniauth gem 文档中了解更多信息。
    【解决方案2】:

    我遇到了同样的问题,并通过从用户模型中删除 :omniauthable 解决了它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 2012-01-06
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多