我正在尝试使用ColdFusion 9来解码facebook传递的signed_request变量。它是需要解码的base64 URL编码字符串。为了解码base64字符串,应该做:
ToString( BinaryDecode( 'Base64 URL Encoded String' ) )
当我这样做时,我得到错误:输入和输出编码不相同。
我将此相同的字符串带到此网站并正确解码:http://www.motobit.com/util/base64-decoder-encoder.asp
答案 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>
答案 3 :(得分:0)
查看Ben Nadel关于他是如何做到这一点的帖子:oAuth and CF
他的代码示例向您展示了解决此问题所需的确切内容。他花了一段时间,但它确实有效!
答案 4 :(得分:0)
我知道我在这个评论的游戏上已经迟到但我写了一篇关于这个here!的教程 事实证明,Facebook不使用标准的base64编码,它需要填充到合适的长度。检查链接以获取包含signed_request数据的结构。