2011-09-13 2 views
6

Java 서블릿의 doPost에서 Facebook signed_request를 구문 분석하려고합니다. 그리고 commons-codec-1.3의 Base64를 사용하여 서명 된 요청을 디코딩합니다. 여기 내가하는 데 사용되는 코드입니다 그 안에 서블릿의 doPostJava를 사용하여 signed_request를 구문 분석하면 형식이 잘못된 JSON이 반환됩니다.

String signedRequest = (String) req.getParameter("signed_request"); 
String payload = signedRequest.split("[.]", 2)[1]; 
payload = payload.replace("-", "+").replace("_", "/").trim(); 
String jsonString = new String(Base64.decodeBase64(payload.getBytes())); 

나는 jsonString를 System.out에 때 잘못입니다. 언젠가 그것은 JSON }의 결말을 그리워합니다. 언젠가는 문자열의 끝에 "}을 그리워합니다.

Facebook에서 적절한 JSON 응답을 받으려면 어떻게해야합니까?

답변

7

facebook은 Base64를 URL로 사용하고 있으며 아마도 표준 Base64 알고리즘을 사용하여 텍스트를 디코딩하려고합니다. URL 변형은 "="으로 패딩 할 필요가 없습니다.

  1. 당신은 코드 (패딩 등)에 필요한 문자를 추가 할 수
  2. 당신은 평민 - 코덱을 사용할 수 있습니다 1.5 (새 Base64로 (참)), 그들은이 인코딩에 대한 지원이 추가 곳.
+0

Apache Commons Codec에 대한 자세한 내용은 http://commons.apache.org/proper/commons-codec/ –

1

자바에서는이 모든 작업을 수행 한 적이 없으므로 전체 답변이 없지만 문자열 끝에있는 문자 중 한두 개를 잃어 버리는 경우가 있으므로 Base64 패딩의 문제 일 수 있습니다. 페이로드의 값을 출력하고 '='로 끝나면 jsonString에 '}'이 누락되어 페이로드가 '=='으로 끝나면 jsonString이 누락 된 ''} ''이 있는지 확인할 수 있습니다. 그렇다면 빈 비트를 나타낼 것으로 예상되는 페이로드 끝에있는 등호의 해석에 문제가 있습니다.

편집 : Facebook이 Base64 URL 인코딩을 사용하고 있기 때문에 이것이 더 믿어집니다. add = as pad chars) 대신에 일반 Base64 대신 일반 Base64가 필요합니다.

+0

I 인쇄 : 당신은 당신이 Base64로 당신이 해독 할 데이터를 인코딩 내가 값을 해결하기 위해이 기능을 사용 4.

의 배수가 아닌 길이가 문제가 말할 수있는 signed_request는 페이로드 끝에 = 또는 ==를 표시하지 않습니다. 내가 잘못된 서명 된 요청을 받고 있음을 의미합니까? Facebook 앱 설정 중에 내가 준 URL 때문에 잘못 될 가능성이 있습니까? – amadamala

+0

자바 함수는 입력이 = chars로 패딩 될 것으로 예상하지만 Facebook은이를 사용하지 않을 것이라고 생각합니다. decodeBase64가 문자열로 다르게 동작하는 경우 payload.getBytes() 대신 직접 payload를 전달해보십시오. 그런 다음 decodeBase64가 -_ 또는 +/chars.s의 표시를 기반으로 인코딩을 자동 감지하도록 설정되어있는 경우 바꾸기 호출을 건너 뛰십시오. 모두 실패하면 Base64의 URL 변형을 인식하는 다른 방법을 찾아야하며, 또는 불일치를 해결하기 위해 입력 또는 출력을 퍼지 할 수 있습니다 (마지막 1-2 문자에만 영향을 미치기 때문에 실행 가능해야 함). –

+0

http : // qugstart를 확인하십시오.co.kr/blog/ruby-and-rails/facebook-base64-url-decode-for-signed_request/ – maximbr

1

이 코드와 매우 유사한 코드를 사용하여 common-codec-1.5로 업그레이드했는데 발생하지 않았습니다. 온라인 게임을 사용하여 실제 페이로드가 잘못되었음을 확인 했습니까? 코더?

4

페이스 북에서 "unpadded"Base64 값 (URL "표준")을 보내고 있으며 예상하지 못한 Java 디코더에 문제가 있습니다.

public static String padBase64(String b64) { 
    String padding = ""; 
    // If you are a java developer, *this* is the critical bit.. FB expects 
    // the base64 decode to do this padding for you (as the PHP one 
    // apparently 
    // does... 
    switch (b64.length() % 4) { 
    case 0: 
     break; 
    case 1: 
     padding = "==="; 
     break; 
    case 2: 
     padding = "=="; 
     break; 
    default: 
     padding = "="; 
    } 
    return b64 + padding; 

} 
+0

여기를 참조하십시오. 나를위한 속임수. 감사! – Ben

+0

Me. 고맙습니다. –

관련 문제