11

在用户允许 facebook auth 并使用令牌重定向到我的应用程序回调后,我正在尝试为带有 Warden 的应用程序实现 facebook 身份验证,我在使用 api 时得到 400。我的典狱长策略是这样的:

class Facebook < Warden::Strategies::Base
  def client
    @client ||= OAuth2::Client.new MyApp::Facebook::AppID, MyApp::Facebook::AppSecret, :site => 'https://graph.facebook.com'
  end

  def params
    @params ||= Rack::Utils.parse_query(request.query_string)
  end

  def authorize_url
    client.web_server.authorize_url :redirect_uri => request.url, :scope => 'email,publish_stream'
  end

  def authenticate!
    throw(:halt, [302, {'Location' => authorize_url}, []]) unless params['code']
    facebook = client.web_server.get_access_token params['code'], :redirect_uri => request.url
  rescue OAuth2::HTTPError => e
    puts e.response.body
  end
end

Strategies.add :facebook, Facebook

打印响应正文的结果是这样的:

{"error":{"type":"OAuthException","message":"Error validating client secret."}}

我很确定 app id 和 app secret 是 FB 提供的。

谢谢。

4

2 回答 2

26

我已经多次看到该错误消息。以下是我要仔细检查的事情:

  • 您的域与您在 facebook 回调 url 中列出的域相同
  • 应用程序 ID 是正确的(实际上是在页面上打印出来,有时是
  • 应用程序密码正确
于 2012-07-18T16:33:51.037 回答
1

在创建将解决问题的 facebook 对象时添加 redirect_uri。

将用户重定向到https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL 用户点击允许后,它会点击我们的重定向 Uri 此时我们将获得代码,我们需要执行服务器端 HTTP 获取以下 URL 以与我们的 oAuth 访问令牌交换代码:

https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&

 client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

现在在第 3 步,我不断收到 Http 400 响应。

因此,经过一番研究,我发现在我们在步骤 3 中提交的那个 redirect_uri 上除了验证请求之外什么也没做。因此,该值需要与步骤 2 匹配。

于 2019-08-22T09:49:53.180 回答