2011-08-26 2 views
8

EDIT :이 버그가 기록되어 Facebook bug으로 확인되었습니다. 이제 수정되었습니다!fbsr_ 쿠키에 OAuth 2.0 저장 하위 도메인이있는 새로운 JS SDK?



나는 새로운 JS SDK로 이동 내 업데이트를 테스트입니다. 내 앱이 내 도메인의 여러 하위 도메인에서 실행됩니다. 이전 JDK에, 나는 이런 식으로 뭔가를 호출했다 :

FB.init({ 
    appId: [APP_ID], 
    status: false, 
    cookie: true, 
    xfbml: true 
}); 
FB.login(); 

새로운 JDK에를, 그것은 다음과 같습니다 : 쿠키 관리자가 FF에 추가 사용

FB.init({ 
    appId: [APP_ID], 
    status: false, 
    cookie: true, 
    xfbml: true, 
    oauth:true 
}); 
FB.login(); 

, 당신은 오래된 것을 볼 수 있습니다 버전은 mydomain.com에 쿠키를 설정하지만 새 쿠키는 www.mydomain.com으로 설정됩니다. 즉, 다른 하위 도메인이 쿠키에 액세스 할 수 없음을 의미합니다. 문제는 내가 다른 하위 도메인에 대한 페이스 북의 쿠키를 사용할 수 없다는 것입니다, 나는 모든 하위 도메인을 로그인하는 경우 또한, 당신이 OAuth를 설정하면 모든 하위 도메인도

+1

을 ... http://developers.facebook.com/bugs –

+0

Tim이 제안한 것처럼 이것을 버그로보고하는 것이 좋습니다. 나는이 새로운 행동을 확인할 수 있으며, 그것이 내 앱에 직접적으로 영향을 미치지 않더라도 적어도 문서화되지 않은 변화 다. – MartinodF

+1

여기에 버그로 기록됩니다. https://developers.facebook.com/bugs/256155664428653?browse=search_4e843e6d89a232275456793 – Abby

답변

3

업데이트 : Facebook에서 버그가 '고정'으로 업데이트되었습니다. 만세!

은 페이스 북의 버그와, 기록 재생 여기에 높은 우선 순위 받아 들여졌다 : 나는 당신이 이것에 대한 버그를 제출해야한다고 생각 https://developers.facebook.com/bugs/256155664428653?browse=search_4e843e6d89a232275456793

+0

혹시이 문제를 해결하는 데 운이 좋았습니까? 같은 문제가 있습니다. –

+0

나는 지저분한 일을하고 있습니다. 쿠키를 사용하는 대신 auth 응답 sig와 내용을 ajax를 통해 내 서버로 보냈고 서버 측 세션을 사용합니다. – Abby

+0

그쪽으로 nks! 이 같은 것을 직접하려고 노력할 것입니다. –

15

에서 그들을 로그 아웃해야합니다 :

는 명확히하기 위해 Javascript API를 통해 FB.init()를 호출 할 때 true로 설정하면 fbs_APP_ID 쿠키 대신 "fbsr_APP_ID"쿠키가 생성됩니다 ("r"에주의하십시오). 여기에는 서명 된 요청과 oauth 마이그레이션의 일부가 포함됩니다.

PHP SDK를 사용하는 경우 변경 사항을 처리해야합니다.

그러나, 웹 사이트에 대한 문서는 새로운 get_facebook_cookie() 함수로 업데이트되지 않는 것 같습니다 : https://developers.facebook.com/docs/guides/web/

그것은 여전히 ​​이전 쿠키 형식을 사용합니다. 당신이 여기에 문서를 통해 access_token이에 쿠키에서 "코드"매개 변수를 설정해야합니다 그리고

http://developers.facebook.com/docs/authentication/signed_request/

: : 현재 서명 요청을 구문 분석하는 방법을 찾을 수 있습니다 developers.facebook.com/docs을/authentication/(StackOverflow 스팸 방지를위한 http : //가 아니기 때문에)

새로운 PHP SDK의 출처에서 모든 문서가 업데이트 된 것으로 보이지 않기 때문에 약간 알아 냈습니다.

내가 사용하고있는 전체 코드는 위와 약간의 변형을 통해 기존 또는 새로운 쿠키 형식으로 작업 할 수 있습니다. 새로운 get_facebook_cookie() 함수는 몇 가지 추가 배열 요소 (algorithm, code, issued_at, user_id)를 반환하고 일부 배열 요소는 더 이상 설정되지 않습니다 (base_domain, secret, session_key, sig). 대부분의 사람들이 찾고있는 주요 변수가 가장 가능성이

function get_facebook_cookie($app_id, $app_secret) { 
    if ($_COOKIE['fbsr_' . $app_id] != '') { 
     return get_new_facebook_cookie($app_id, $app_secret); 
    } else { 
     return get_old_facebook_cookie($app_id, $app_secret); 
    } 
} 

function get_old_facebook_cookie($app_id, $app_secret) { 
    $args = array(); 
    parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args); 
    ksort($args); 
    $payload = ''; 
    foreach ($args as $key => $value) { 
     if ($key != 'sig') { 
      $payload .= $key . '=' . $value; 
     } 
    } 
    if (md5($payload . $app_secret) != $args['sig']) { 
     return array(); 
    } 
    return $args; 
} 

function get_new_facebook_cookie($app_id, $app_secret) { 
    $signed_request = parse_signed_request($_COOKIE['fbsr_' . $app_id], $app_secret); 
    // $signed_request should now have most of the old elements 
    $signed_request[uid] = $signed_request[user_id]; // for compatibility 
    if (!is_null($signed_request)) { 
     // the cookie is valid/signed correctly 
     // lets change "code" into an "access_token" 
     $access_token_response = file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=$app_id&redirect_uri=&client_secret=$app_secret&code=$signed_request[code]"); 
     parse_str($access_token_response); 
     $signed_request[access_token] = $access_token; 
     $signed_request[expires] = time() + $expires; 
    } 
    return $signed_request; 
} 
+0

감사합니다. oauth를 사용하여 새로운 동작에 만족합니다. 사실이지만 내 질문은 새 쿠키를 사용하는 방법보다는 호스트/하위 도메인 문제에 관한 것입니다. 쿠키는 www.domain.com 호스트로 설정되지만 subdomain.domain.com의 서버에서 쿠키를 읽어야하며 여기에서는 사용할 수 없습니다. 이전 쿠키는 www.domain.com 호스트가 아닌 domain.com이라는 도메인을 가지고 있습니다. – Abby

+0

.net에 대해 완료 될 수 있기를 바랍니다. # –

0

1하지만 (UID, access_token이, 그리고 만료) 설정)은 응용 프로그램을 확인합니다. 도메인 설정은 www.mydomain이 아닌 mydomain.com으로 설정됩니다.COM
2) 초기화에 채널 파일 및 URL을 사용

FB.init({ 
appId : [APP_ID], 
status : false, 
cookie : true, 
xfbml : true, 
channelUrl : document.location.protocol + "//domain.com/xd_receiver.html", 
oauth : true 
}); 

https://developers.facebook.com/docs/reference/javascript/FB.init/

희망이

+0

mydomain.com을 사용하고 있습니다. 나는 과거에 channelurl을 사용하려했지만 결코 운이 없었습니다. 나는 다시 시도하고 그것이 어떻게되는지 보게 될 것이다. 고마워요 – Abby

+0

channelUrl을 추가했는데 쿠키에 여전히 하위 도메인을 지정하는 호스트가 있습니다. ( – Abby

0

체크 아웃 앱 도메인에서이 https://developers.facebook.com/apps/<appid>/요약

모양을하는 데 도움이 : "Basic Info :"의 일부인
"www.example.com"을 지정하면 해당 정보가 나타납니다. www.example.com에서 일합니다. "example.com"을 사용하면 * .example.com으로 취급되어 모든 하위 도메인에서 작동합니다.

+0

안녕하세요, 이미 mydomain.com으로 설정했는데 여전히 문제가 있습니다. – Abby

+0

php_value session.cookie_domain .domain.com 변경 고려 php.ini 파일에서 루트 도메인 앞의 "."을 참고하십시오. 테스트하지는 않았지만 성공 가능성이있는 경로입니다. 어떻게되는지 알려주세요. http://www.php.net /manual/en/session.configuration.php#ini.session.cookie-domain – adkatrit

+0

내 통합은 자바를 사용합니다 – Abby