【问题标题】:Broken FB-omniauth after bundle update, invalid credentials捆绑更新后 FB-omniauth 损坏,凭据无效
【发布时间】:2017-03-28 09:58:20
【问题描述】:

oauth 数据不会进入控制器操作。无法理解出了什么问题。此控制器中还有一个身份验证提供程序,并且运行良好,核心完全相同。

devise  3.5.10 
rails 4.2.4

devise.rb
config.omniauth :facebook, Figaro.env.fb_app_id, Figaro.env.fb_app_secret, callback_url: 'https://chotam.ru/users/auth/facebook/callback',
                  scope: 'email, publish_actions'

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

def facebook
    logger.error "fb here" # IT'S NO OUTPUT HERE ON REQUEST!!!
    logger.error(request.env['omniauth.auth'])
    result = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
    @user = result[:user]
    status = result[:status]
    if @user
      token = request.env["omniauth.auth"]["credentials"]["token"]
      @user.account.update_attribute(:fb_token, token)
      if status[:redirect] == 'added' || status[:redirect] == 'existed'
        flash[status[:key]] = status[:value]
        render 'devise/registrations/edit'
      else
        flash[status[:key]] = status[:value]
        sign_in_and_redirect @user, event: :authentication
      end
    else
      flash[status[:key]] = status[:value]
      redirect_to new_user_registration_url
    end
  end

更新 使用记录器,我可以看到以下内容:

E, [2017-03-28T23:46:41.255481 #21494] ERROR -- : (facebook) Authentication failure! invalid_credentials: OAuth2::Error, :
{"access_token":"real_token","token_type":"bearer"$

如何找出问题所在? 而且我发现用户不能再更改他们的密码了。

【问题讨论】:

  • 我遇到了同样的错误...我知道 Facebook 昨天(2017 年 3 月 27 日)升级了他们的 API,所以我正在挖掘我的代码以更好地理解。如果我发现了,我会在这里发帖。

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


【解决方案1】:

好的...找到了一种无需更新 gem 的方法。

您可以在config/initializers/devise.rb 文件的config.omniauth 行中添加以下内容:

client_options: {
  site: "https://graph.facebook.com/v2.3",
  authorize_url: "https://www.facebook.com/v2.3/dialog/oauth"
},
token_params: {
  parse: :json
}

带有完整配置的 YMMV,但它看起来像这样:

config.omniauth :facebook, ENV["FACEBOOK_KEY"], ENV["FACEBOOK_SECRET"],
    scope: 'email',
    secure_image_url: true,
    auth_type: 'https',
    info_fields: 'email,name,first_name,last_name',
    client_options: {
        site: "https://graph.facebook.com/v2.3",
        authorize_url: "https://www.facebook.com/v2.3/dialog/oauth"
    },
    token_params: {
        parse: :json
    }

主要问题是他们升级了响应格式并且没有强制版本指针和令牌参数来解析新的 json 格式(而不是 url 编码格式),它会在响应中中断,因为它无法识别什么被api吐回来了。

【讨论】:

  • 但仅从我的计算机...其他用户有错误:(facebook)身份验证失败! no_authorization_code:OmniAuth::Strategies::Facebook::NoAuthorizationCodeError,必须通过 code(通过 URL 或通过 fbsr_XXX 签名的请求 cookie)
  • 其他用户是什么意思?如果您在本地计算机上进行了更新,那么他们如何访问您的本地计算机?
  • No)) 我更新了生产服务器,我可以通过FB进入。我做了几次。但是我的朋友遇到了一个错误。我尝试从 iphone 访问网站,但也遇到了错误...
  • 嗯,很难准确地说出...尝试在 stackoverflow 上与此问题分开查找该新错误。也许您的配置或应用程序中的其他内容不起作用。
  • 看起来如果你向下滚动到 SEMVC 的评论,他们有同样的问题,并且 NUNZIOFIORE 回复了一个修复:coderwall.com/p/bsfitw/…,但这绝对是一个单独的问题,所以如果你不这样做'找不到这个解决方案,继续在谷歌上挖掘。祝你好运
【解决方案2】:

试试这个。您必须更新 facebook-omniauth gem。 How to fix invalid credential? omniauth-facebook gem broken after Facebook API Deprecation.

在这里花了很多时间,在修复之前 - omniauth-facebook issue

【讨论】:

  • 谢谢...很高兴知道。我将尝试找到一种在不更新 gem 的情况下工作的方法(有生产 gem 更改原因导致更新 gem 不太理想),所以如果我能找到可行的方法,我会回答除了更新 gem。
猜你喜欢
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2020-01-23
相关资源
最近更新 更多