Использование Coldfusion для декодирования facebook подписанного_запроса - PullRequest
0 голосов
/ 22 марта 2011

Я пытаюсь использовать ColdFusion 9 для декодирования переменной Sign_request, которую передает Facebook.Это строка в кодировке URL base64, которую необходимо декодировать.Чтобы декодировать строки base64, нужно сделать:

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

Когда я это делаю, я получаю сообщение об ошибке: входные и выходные кодировки не совпадают.

Я взял эту же строку на этом сайтеи расшифровал его правильно: http://www.motobit.com/util/base64-decoder-encoder.asp

Ответы [ 5 ]

2 голосов
/ 26 августа 2011

Проблема в том, что в параметре sign_request Facebook нет дополнения "=" в конце.Ожидается, что принимающая сторона добавит заполнение перед тем, как будет введена через 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 голос
/ 23 марта 2011

Я нашел решение этой проблемы.Кажется, что встроенная функция 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>
0 голосов
/ 07 февраля 2012

Я знаю, что опоздал на игру с этим комментарием, но я написал учебник именно по этому здесь! Оказывается, что Facebook не использует стандартную кодировку base64, и его нужно дополнить доправильная длина.Проверьте ссылку, чтобы получить структуру, содержащую данные из signature_request.

0 голосов
/ 23 марта 2011

Ознакомьтесь с постом Бена Наделя о том, как он это сделал: oAuth и CF

Его примеры кода показывают, что вам нужно сделать, чтобы решить эту проблему.Это заняло у него некоторое время, но это работает!

0 голосов
/ 23 марта 2011

Быстрый поиск в сети заставляет меня думать, что ответ 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>

по этому URL: http://pastebin.com/bFb1bBpU

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...