3

StackOverflow를 샅샅이 조사하고 아무 도움없이 페이스 북에 버그를 제출했습니다. 나는 이것을 단호하게 40 시간 이상 보냈다. FB.INIT와 PHP 액세스 토큰 사이에 충돌이 있다고 생각합니다. 서버에 무거운 .htaccess Mod Rewrites가있는 경우 URL을 유효한 쿼리 문자열로 변경합니다. 나는 버그로 작성했지만 페이스 북은 그것이 사용자 문제라고 믿는다. 나는 심지어 그들의 대답에 코드를 사용하고 그것은 여전히 ​​도청입니다.Facebook JS SDK 및 PHP SDK 액세스 토큰 충돌

원래 문제가 있습니다. 내 테스트 사이트에서 JS SDK로 PHP SDK를 제대로 사용할 수 있습니다. 은 모두 로그인을 허용하고 서로 통신하면서 조화롭게 작동합니다. 문제가없는 페이지를 서핑하거나 모든 기능을 수행 할 때 클라이언트를 업데이트하려고합니다. .

이제 고객 사이트에 새 OAuth를 업데이트하려고합니다. .htaccess mod Rewrites. 내 테스트 사이트에 Mod ReWrites가없는 곳.

처음에는 PHP로 로그인 할 수있었습니다. 그러나 일단 사이트 내의 다른 페이지로 간다면 대중적인 오류로 Access 토큰을 잃어 버렸습니다. 액티브 액세스 토큰을 사용하여 현재 사용자에 대한 정보를 쿼리해야합니다. 그리고 액세스 토큰을 재설정 :

는 PHP API를 실패 있는지 확인하고 다음 (? https://graph.facebook.com/oauth/access_token에 대해) 페이스 북의 자신의 인증 페이지에서 가져온] 명령 file_get_contents를 사용하여 수정되었습니다. 이것은 효과가 있었다. 그러나 이로 인해 응답 오류로 인해 FB.init가 실패했습니다. 현재 사용자에 대한 정보를 쿼리하려면 활성 액세스 토큰을 사용해야합니다. FB.api ('/ me')가 콜백 함

이렇게하려면 PHP 액세스 토큰을 세션에 전달하고 내 API 호출에 을 입력해야했습니다. 마찬가지로 FB.api ('/ me /? access_token ='). 이것은 효과가 있었다. 이제는 내 사이트가 페이스 북에서 PHP를 지배하고 JS가 보조로 작동합니다.

현재 문제 : 사용자가 사이트를 방문하여 PHP Facebook 기능에 로그인하지 않고 FB JS SD를 사용하는 기능을 사용하는 경우 사이트에서 해당 사이트 기능에 대한 적절한 사용 권한을 가진 JS 로그인 메시지를 표시합니다. 사용자 은 동의하고 로그인합니다. JS stand-point에서 모든 것이 잘됩니다. console.log 덤프에서 페이지별로이 사실을 알 수 있습니다.

문제 : PHP는 JS SDK에 의해 설정된 쿠키에서 access_token은 인정하지 않으며이 file_get_contents에서 쿠키를 (다시 맞이할 는 HTTP 요청 (400)를 실패) 받게됩니다. 따라서 사용자가 JS를 통해 로그인하는 동안, PHP는 로그인을 수락하지 않고 PHP getLoginUrl 함수를 표시합니다.

PHP 페이스 북 개체에서 var_dump가 수행되면 모든 필드가 표시됩니다 ( ). 코드, 상태, access_token, 알고리즘 등. 그러나 위의 페이지에서 $ facebook-> api ('/ me')를 수행하면 오류가 발생합니다. 현재 사용자에 대한 정보 인 을 쿼리하려면 활성 액세스 토큰을 사용해야합니다.

결론 : JS의인지 된 URL 과 PHP의 실제 URL을 기반으로 코드 생성이 일치하지 않습니다.JS를 PHP 액세스 인 토큰으로 강제 실행하는 것이 더 쉬운 이유는 JS가 PHP를 지배 할 수 없기 때문입니다.

다음은 모든 페이지의 PHP 코드입니다.

$app_id = 'APP_ID'; 
$app_secret = 'APP_SEC'; 
$my_url = 'http://'.$_SERVER['HTTP_HOST']; 
$facebook = new Facebook(array(
    'appId' => $app_id, 
    'secret' => $app_secret, 
)); 
$_SESSION[fbappID] = $facebook->getAppId(); 
$_SESSION[fbaccTok] = $facebook->getAccessToken(); 
$sigReq = $facebook->getSignedRequest(); 
$code = $sigReq[code]; 
$userID = $facebook->getUser(); 
if($userID) 
{ 
    try { 
    $user_profile = $facebook->api('/me'); 
    } catch (FacebookApiException $e) { 
    error_log($e); 
    $token_url = "https://graph.facebook.com/oauth/access_token?" 
     . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) 
     . "&client_secret=" . $app_secret . "&code=" . $code; 
    $response = file_get_contents($token_url); 
    $params = null; 
     parse_str($response, $params); 
     if($params[access_token]!="") 
    { 
     $facebook->setAccessToken($params[access_token]); 
     $_SESSION[fbaccTok] = $facebook->getAccessToken(); 
    } 
    try{ 
     $user_profile = $facebook->api('/me'); 
    }catch(FacebookApiException $e) { 
     error_log($e); 
     $userID = null; 
    } 
    } 
} 
if($userID) 
{ 
    $user_profile = $facebook->api('/me'); 
    $logout = $facebook->getLogoutUrl(); 
} 
else 
{ 
    $login = "<a href='".$facebook->getLoginUrl()."'>Log In with Facebook</a>"; 
} 

자바 스크립트 사용 :

<script> 
FB.init({ 
    appId : '$_SESSION[fbappID]', 
status : true, 
    cookie : true, 
    xfbml : true, 
    oauth : true 
    }); 
    FB.api('me/permissions/?access_token=<?php print $_SESSION[fbaccTok]? 
    >',function(response){console.log(response)}); 
</script> 

답변 : 자바 스크립트 항목의 주요 포인트가 될 수 있도록하려면 다음은

는 대답이다. 둘 다 가질 수는 없습니다. 당신은 하나, PHP 또는 자바 스크립트를 선택하고 다른 사람의 액세스 토큰을 강제로 지배해야합니다. 다음은 자바 스크립트입니다.

window.fbAsyncInit = function() { 

    FB.init({ 
     appId : '12345', 
     channelURL : '/channel.php', 
     status : true, 
     cookie : true, // enable cookies to allow the server to access the session 
     xfbml : true, // parse XFBML 
     oauth : true //enables OAuth 2.0 
    }); 
FB.getLoginStatus(function(response){ 
    if(response.authResponse){ 
     FB.accessToken = ; 
     createCookie('fbToken',response.authResponse.accessToken,.1); 
     createCookie('fbID',response.authResponse.userID,.1); 
    } 
    }); 
FB.Event.subscribe('auth.login', function(response) { 
    createCookie('fbToken',response.authResponse.accessToken,.1); 
    createCookie('fbID',response.authResponse.userID,.1); 
    createCookie('fbLogin',1,30); 
    window.location.reload(); 

}); 
FB.Event.subscribe('auth.logout', function() { 
     eraseCookie('fbLogin'); 
     eraseCookie('fbToken'); 
     eraseCookie('evFB.uid'); 
}); 
} 

createCookie 및 eraseCookie는 인터넷을 통해 찾을 수있는 쿠키 기능입니다. 이것은 정제 된 것이 아닌 대략적인 코드입니다. 기본적으로 정보를 전달하기 위해 자신의 쿠키를 만듭니다. FB JS SDK는 로그인 및 로그 아웃시 페이지를 새로 고치기 때문에 PHP가 페이지를 새로 고침하기 전에 쿠키를 삭제하고 수정하거나 수정할 수 있습니다.

이제 JS 쿠키 액세스 토큰을 사용하는 PHP가 있습니다.

require_once("/facebook.php"); 

$facebook = new Facebook(array(
    'appId' => $app_id, 
    'secret' => $app_secret, 
)); 
$my_url = $facebook->returnGetUrl(); 
$_SESSION[fbaccTok] = (isset($_COOKIE[fbToken]))?$_COOKIE[fbToken]:$facebook->getAccessToken(); 


$sigReq = $facebook->getSignedRequest(); 
$code = ($_REQUEST[code]=='')?$sigReq[code]:$_REQUEST[code]; 

$GLOBALS[fbUser]= $facebook->getUser(); 

if(isset($_COOKIE[fbLogin])) 
{ 
    if($_COOKIE[fbLogin]==1) 
    { 
     $GLOBALS[fbUser] = $facebook->getUser(); 
     //print $GLOBALS[fbUser]; 
    } 
    else 
    { 
     $GLOBALS[fbUser] = null; 
    } 
} 
else 
{ 
    $GLOBALS[fbUser] = null; 
} 
if($GLOBALS[fbUser] && $_COOKIE[fbToken]) 
{ 
    $GLOBALS[fbArray] = array(
     'access_token' => $_COOKIE[fbToken] 
     ); 
     try { 
      $GLOBALS[fbUserProfile] = $facebook->api('/me','GET',$GLOBALS[fbArray]); 
      //print_r($GLOBALS[fbUserProfile]); 


     } catch (FacebookApiException $e) { 
      error_log($e); 

     } 
} 

희망이 도움이됩니다.

+0

이것은 PHP 3.1.1 SDK –

+0

과 함께 사용하면 더 잘 이해할 수 있습니다. fb js sdk 액세스 토큰을 사용하여 javascript를 통해 쿠키를 만들고 fb phd sdk에서 가져 오는 것은 분명히 작동합니다. – Patareco

답변

0

는 모드 재 작성없이 작동하지만 유행의 재 작성으로, 그 다음에 문제가 있는지,

당신이 할 수있는 것은 다음, 또 다른 페이스 북의 테스트 응용 프로그램을 만들고 모드 재 작성하지 않고 별도의 서버에있는 호스트입니다 점차 mod를 추가하여 문제가 발생할 때까지 한 번에 하나씩 다시 작성하여 어느 것이 문제를 일으키는 지 확인하십시오.

+0

동일한 문제가 발생하며 mod 재 작성 세트가 없습니다. – Matrym

+0

포함 할 내 질문을 업데이트했습니다. 대답. –

+1

@V Rodg 질문 대신에 답변으로 추가해야합니다. 이제는 답변이없는 것으로 표시됩니다. – xorinzor