使用Coldfusion解码facebook signed_request

时间:2011-03-22 20:58:02

标签: facebook coldfusion base64

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

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

当我这样做时,我得到错误:输入和输出编码不相同。

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

5 个答案:

答案 0 :(得分:2)

问题是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>

答案 1 :(得分:1)

我找到了解决这个问题的方法。看起来内置的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>

答案 2 :(得分:0)

快速搜索网络让我觉得facebook的响应是“base64url”,它是为传递网址而编码的。

所以,试着做一个

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

答案 3 :(得分:0)

查看Ben Nadel关于他是如何做到这一点的帖子:oAuth and CF

他的代码示例向您展示了解决此问题所需的确切内容。他花了一段时间,但它确实有效!

答案 4 :(得分:0)

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