ruby - 使用 Sinatra 获取 Facebook signed_request

标签 ruby facebook facebook-graph-api facebook-like sinatra

我想弄清楚用户是否喜欢我们的品牌页面。基于此,我们想要显示一个赞按钮或一些“谢谢”文本。

我正在使用托管在 heroku 上的 sinatra 应用程序。

我尝试了这个线程中的代码:Decoding Facebook's signed request in Ruby/Sinatra

但是,它似乎没有捕获 signed_request,我不明白为什么。

我有以下方法:

get "/tab" do
  @encoded_request = params[:signed_request]
  @json_request = decode_data(@encoded_request)
  @signed_request = Crack::JSON.parse(@json_request)
  erb :index
end

# used by Canvas apps - redirect the POST to be a regular GET
post "/tab" do
  @encoded_request = params[:signed_request]
  @json_request = decode_data(@encoded_request)
  @signed_request = Crack::JSON.parse(@json_request)
  redirect '/tab'
end

我也有来自该线程的帮助消息,因为它们对我来说似乎很有意义:

helpers do
  def base64_url_decode(payload)
    encoded_str = payload.gsub('-','+').gsub('_','/')
    encoded_str += '=' while !(encoded_str.size % 4).zero?
    Base64.decode64(encoded_str)
  end

  def decode_data(signed_request)
    payload = signed_request.split('.')
    data = base64_url_decode(payload)
  end
end

但是,当我刚刚做的时候

@encoded_request = params[:signed_request]

然后在我的观点中读出:

<%= @encoded_request %>

我一无所获

这不应该至少返回一些东西吗?我的应用程序似乎崩溃了,因为没有任何内容需要解码。

我似乎无法在互联网上找到很多关于这方面的信息,所以如果有人能帮助我,我会很高兴。

是否有更好的方法来了解用户是否喜欢我们的页面?或者,这是要走的路吗?我只是忽略了一些显而易见的事情吗?

谢谢!

最佳答案

提示应该出现在您的应用程序崩溃中,因为没有任何内容可解码。

我怀疑重定向时参数丢失了。在 HTTP 级别考虑它:

  • 客户端使用参数中的 signed_request 发布到 /tab
  • 应用解析 signed_request 并将结果存储在实例变量中。
  • 应用程序重定向到 /tab,即发送带有代码 302(或类似代码)的响应和指向 /tabLocation header .这完成了请求/响应周期,实例变量被丢弃。
  • 客户端发出一个新请求:一个 GET 到 /tab。由于重定向的工作方式,这将不再包含与原始 POST 一起发送的参数。
  • 应用程序尝试解析 signed_request 参数,但由于未发送此类参数而崩溃。

最简单的解决方案是只渲染模板以响应 POST 而不是重定向。

如果您确实需要重定向,则需要小心地将 signed_request 作为重定向路径中的查询参数传递。至少这是我过去使用过的解决方案。可能有更简单的方法来解决这个问题,或者有库可以为您处理其中的一些问题。

关于ruby - 使用 Sinatra 获取 Facebook signed_request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9200577/

相关文章:

ruby-on-rails - Watir-webdriver 没有抓取指定的 div,不确定为什么?

ruby-on-rails - 停止使用破折号保存字符串数组

ruby - 使用 Ruby 和 SQL SMO 实现脚本自动化

android - 在 Android 应用程序中集成 Facebook 的 Like 按钮

java - 使用图形 API 在 Facebook 群组上发布照片

ruby - 查询去年数据的范围

ios - FBSDK swift 3 出现 53 个错误

php - Facebook PHP SDK 年龄范围

php - Facebook : "This authorization code has been used.","type":"OAuthException","code":100

iphone - Facebook在ios6中获取用户信息:An active access token must be used to query