2

Я пытаюсь создать поток аутентификации между сервером, используя PHP PHP SDK и без Javascript, как указано here. До сих пор я успешно создал LoginUrl, который позволяет пользователю входить в Facebook, а затем перенаправлять обратно в мое приложение и проверять параметр состояния для защиты CSFR.Обмен Facebook-аутентификацией для токена доступа с использованием PHP SDK

Моя проблема заключается в том, что я не могу заставить работать API-интерфейс, который должен заменить мой код аутентификации для токена доступа. Я разграбил любую аналогичную проблему, с которой столкнулся Google, чтобы найти возможные решения. Но конечный результат всегда был один: нет токена доступа, нет сообщения об ошибке, которое я мог бы оценить.

Исследуя тему дал следующий совет, который я тестировал:

  • URL-адрес, указанный в App Settings должен быть родителем папка $appUrl.
  • использовать локон, чтобы сделать запрос вместо функции SDK api()

Я был на этом в течение 2 дней прямо сейчас и действительно могли бы использовать некоторую помощь.

<?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

Самый простой способ я нашел, чтобы сделать это, чтобы расширить класс Facebook и выставить защищенный 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

Смежные вопросы