gpt4 book ai didi

ruby - 在 Ruby/Sinatra 中解码 Facebook 的签名请求

转载 作者:数据小太阳 更新时间:2023-10-29 06:43:54 24 4
gpt4 key购买 nike

由于 Facebook 弃用新的 FBML,我正在寻找一种创建“显示”选项卡(向粉丝显示一个版本而向非粉丝显示另一个版本的页面选项卡)的新方法。 Facebook 已将数据添加到 signed_request:

When a user selects your app in the left-hand menu, the app will receive the signed_request parameter with one additional parameter, page, a JSON array which contains the ‘id’ of the Facebook Page your Tab is hosted within, a boolean (‘liked’) indicating whether or not a user has liked the Page, and a boolean (‘admin’) indicating whether or not the user is an ‘admin’ of the Page along with the user info array.

我能够很好地读取 signed_request,但随后我需要使用 base64url 解码对其进行处理以获得正确的 JSON。此外,我在研究中发现 JSON 的 Ruby 格式不正确,因此需要在解码之前对其进行修改。这是当前代码(我现在只是在 index.erb 中打印签名请求):

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

def decode_data str
encoded_sig, payload = str.split('.')
data = ActiveSupport::JSON.decode base64_url_decode(payload)
end
end

get '/' do
signed_request = params[:signed_request]
@signed_request = decode_data(signed_request)
erb :index
end

我试图让应用程序尽可能轻便,并避免使用完整的 Facebook 库,因为这不是一个完整的应用程序(只是一个选项卡)并且不需要用户的任何额外许可。也欢迎就我的粉丝检测方法提出任何建议。

最佳答案

我以前遇到过这个。您只需用 = 标记填充有效负载字符串的末尾,直到其长度可以被 4 整除。

这会起作用:

payload += '=' * (4 - payload.length.modulo(4))

(我不确定 Facebook 在哪里/是否对此进行了记录,但 IRC 上有人在 2011 年初告诉我这件事,果然,我在各种 Facebook 客户端库的源代码中发现了这样的填充)

关于ruby - 在 Ruby/Sinatra 中解码 Facebook 的签名请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4987772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com