2

here과 같이 Facebook PHP SDK 및 Javascript를 사용하지 않고 서버 간 인증 흐름을 구축하려고합니다. 지금까지 사용자가 Facebook에 로그인 한 다음 내 앱으로 다시 리디렉션하고 CSFR 보호를위한 상태 매개 변수를 확인할 수있게 해주는 LoginUrl을 성공적으로 만들었습니다.PHP SDK를 사용하여 액세스 토큰에 대한 Facebook 인증 코드 교환

내 문제는 액세스 토큰에 대한 인증 코드를 바꿔야하는 API 호출이 작동하지 않는 것 같습니다. 나는 구글이 가능한 해결책을 찾다가 찾을 수 있었던 모든 비슷한 문제를 털어 놓았다. 그러나 최종 결과는 항상 동일합니다. 액세스 토큰이 없으며 평가할 수있는 오류 메시지가 없습니다.

  • $appUrl의 상위 폴더 여야합니다 App Settings에 지정된 URL을 : 주제를 검토 한 결과

    내가 시험을 다음과 같은 조언을 얻었다.

  • 사용 컬는 요청 대신 내가 바로 지금 2 일 동안 이것했던 SDK 기능 api()

를 만들기 위해 정말 도움을 사용할 수 있습니다.

<?php 

require '../inc/php-sdk/src/facebook.php'; 
// Setting some config vars 

$appId = 'MY_APP_ID'; 
$secret = 'MY_APP_SECRET'; 
$appUrl = 'https://MY_DOMAIN/appFolder'; 
$fbconfig = array('appId'=>$appId, 'secret'=>$secret); 

$facebook = new Facebook($fbconfig); 

// Log User in with Facebook and come back with Auth Code if not yet done 
if(!(isset($_SESSION['login']))){ 
    $_SESSION['login']=1; 
    header('Location: '.$facebook->getLoginUrl()); 
} 
// process Callback from Facebook User Login 
if($_SESSION['login']===1) { 
    /* CSFR Protection: getLoginUrl() generates a state string and stores it 
in "$_SESSION['fb_'.$fbconfig['appId'].'_state']". This checks if it matches the state 
obtained via $_GET['state']*/ 
    if (isset($_SESSION['fb_'.$fbconfig['appId'].'_state'])&&isset($_GET['state'])){ 
     // Good Case 
     if ($_SESSION['fb_'.$fbconfig['appId'].'_state']===$_GET['state']) { 
      $_SESSION['login']=2; 
     } 
     else { 
      unset($_SESSION['login']); 
      echo 'You may be a victim of CSFR Attacks. Try <a 
href="'.$facebook->getLoginUrl().'">logging in</a> again.'; 
     } 
    } 
} 

// State check O.K., swap Code for Token now 
if($_SESSION['login']===2) { 
    $path = '/oauth/access_token'; 
    $api_params = array (
      'client_id'=>$appId, 
      'redirect_uri'=>$appUrl, 
      'client_secret'=>$secret, 
      'code'=>$_GET['code'] 
    ); 
    $access_token = $facebook->api($path, 'GET', $api_params); 
    var_dump($access_token); 
} 

답변

1

내가이 일을 발견하는 가장 쉬운 방법은 보호 getAccessTokenFromCode을 페이스 북의 클래스를 확장하고 노출하는 것입니다() 메소드 :

<?php 

class MyFacebook extends Facebook { 

    /** If you simply want to get the token, use this method */ 
    public function getAccessTokenFromCode($code, $redirectUri = null) 
    { 
     return parent::getAccessTokenFromCode($code, $redirectUri); 
    } 

    /** If you would like to get and set (and extend), use this method instead */ 
    public function setAccessTokenFromCode($code) 
    { 
     $token = parent::getAccessTokenFromCode($code); 
     if (empty($token)) { 
      return false; 
     } 
     $this->setAccessToken($token); 
     if (!$this->setExtendedAccessToken()) { 
      return false; 
     } 
     return $this->getAccessToken(); 
    } 

} 

나는 또한 내가 설정하는 데 사용하는 편리한 메소드의 변형을 포함 내 자신의 코드에 공개 "get"메소드가 실제로 필요하지 않기 때문에 액세스 토큰.

+0

위대한 작품입니다. – Sarke