【问题标题】:Using Coldfusion to decode a facebook signed_request使用 Coldfusion 解码 facebook signed_request
【发布时间】:2011-03-22 20:58:02
【问题描述】:

我正在尝试使用 ColdFusion 9 来解码 facebook 传递的 signed_request 变量。它是一个需要解码的 base64 URL 编码字符串。为了解码 base64 字符串,应该这样做:

ToString( BinaryDecode( 'Base64 URL Encoded String' ) )

执行此操作时出现错误:输入和输出编码不同。

我把这个相同的字符串带到这个网站并正确解码:http://www.motobit.com/util/base64-decoder-encoder.asp

【问题讨论】:

    标签: facebook coldfusion base64


    【解决方案1】:

    问题在于 Facebook signed_request 参数末尾没有任何“=”填充。它期望接收端在通过 BinaryDecode() 之前添加填充。

    试试

    <cfset signed_request = listtoarray(form.signed_request,".")>
    <cfset fb_str = replacelist(signed_request[2], "-,_", "+,/")>
    <cfset padding = repeatstring("=",4-len(fb_str) mod 4)>
    <cfset data = toString(BinaryDecode(fb_str & padding,"base64"))>
    <cfoutput>#data#</cfoutput>
    

    【讨论】:

      【解决方案2】:

      我找到了解决这个问题的方法。似乎内置的 ColdFusion BinaryDecode 函数可以处理其中一些字符串。代码如下:

      <cfset fb_str = Replace(Replace(ListGetAt(FORM.signed_request, 2, "."), "-", "+", "ALL"), "_", "/", "ALL")>
      <cfset jstr = JavaCast("string", fb_str)>
      <cfset decoder = CreateObject("java", "org.apache.commons.codec.binary.Base64")>
      <cfset result = decoder.decodeBase64(jstr.getBytes())>
      <cfoutput>#ToString(result)#</cfoutput>
      

      【讨论】:

      【解决方案3】:

      在网上快速搜索让我认为 facebook 响应是“base64url”,它被编码用于传递 url。

      所以,尝试做一个

      ToString( BinaryDecode( UrlDecode('Base64 URL Encoded String') ) )
      

      而且,如果这不起作用,我找到了这个功能

         <cffunction name="Base64URLDecode" access="public" output="false" returntype="string" hint="Returns a base64url decoded string.">
                  <cfargument name="String" type="string" required="true" hint="String to decode.">
      
                  <cfreturn Variables.Base64Decode( Replace( Replace( Arguments.String, "-", "+", "all"), "_", "/", "all") & RepeatString("=", Len(Arguments.String) + (4 - Len(Arguments.String) % 4) % 4))>
          </cffunction>
      

      来自这个网址:http://pastebin.com/bFb1bBpU

      【讨论】:

      • 感谢爱德华的快速回复,这些方法都没有奏效。第一种方法给了我与以前相同的错误,第二种方法使用未定义的方法调用“Base64Decode()”
      • 啊,没仔细看。 Base64Decode 是我发布的 pastebin 链接中的另一个函数。
      【解决方案4】:

      查看 Ben Nadel 的帖子,了解他是如何做到的:oAuth and CF

      他的代码示例准确地向您展示了解决此问题所需的操作。他花了一段时间,但它有效!

      【讨论】:

      • 我没有在您发送给我的那个链接中看到代码。我想我已经浏览了这些链接。我看过 Ben 的这篇文章:Ben's post。此方法失败,因为 facebook 没有在末尾用等号填充他们的字符串。我在 cmets 中发布了一个链接来解释我的答案。这是facebook的错=P。 explanation
      【解决方案5】:

      我知道我在这个评论上迟到了,但我写了一篇关于这个here!的教程 事实证明,Facebook 不使用标准的 base64 编码,它需要填充到正确的长度。检查链接以获取包含来自 signed_request 的数据的结构。

      【讨论】:

      • 谢谢,如果您查看答案的 cmets,我也想出了那部分。我为此拉了一会儿头发。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2012-01-08
      • 2012-02-09
      • 1970-01-01
      相关资源
      最近更新 更多