facebook php sdk - поймайте, если пользователь не предоставил разрешения (ошибка аутентификации)


В документации говорится: "перенаправление_uri - (необязательно) URL-адрес для перенаправления пользователя после завершения процесса входа/авторизации. Пользователь будет перенаправлен на URL-адрес как при успешном, так и при неудачном входе в систему, поэтому вы должны проверить параметры ошибки в URL-адресе, как описано в документации по аутентификации. Если это свойство не указано, пользователь будет перенаправлен на текущий URL-адрес (т. е. URL-адрес страницы, на которой был вызван этот метод, обычно текущий URL-адрес в браузер)." Таким образом, есть способ поймать, если пользователь отказался от аутентификации/разрешений, но ссылка на соответствующую документацию больше не существует (https://developers.facebook.com/docs/authentication/).

Для простоты, redirect_uri - это тот же адрес, что и исходный php-файл, а php-код так же прост, как:

require 'facebook.php';
$facebook = new Facebook(array(
  'appId'  => 'X',
  'secret' => 'Y',
));
$user = $facebook->getUser();
if ($user) {
  try {
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}
if (!$user) {
  $params = array(
    'scope' => 'read_stream, friends_likes',
    'redirect_uri' => 'http://myapp.com/app'
  );
  $loginUrl = $facebook->getLoginUrl($params);
}

Кто-нибудь знает, как получить эту информацию?

Author: Marcin Bobowski, 2013-02-08

3 answers

Вы можете сделать следующее, чтобы проверить разрешения:

$permissions = $facebook->api("/me/permissions");
if( array_key_exists('publish_stream', $permissions['data'][0]) ) {
    // Permission is granted!
    // Do the related task
    $post_id = $facebook->api('/me/feed', 'post', array('message'=>'Hello World!'));
} else {
    // We don't have the permission
    // Alert the user or ask for the permission!
    header( "Location: " . $facebook->getLoginUrl(array("scope" => "publish_stream")) );
}
 11
Author: AlphaMale, 2013-02-08 11:23:45

Следует отметить, что в новейшем PHP facebook SDK нет метода ->api. Также, похоже, существует проблема с использованием этой проверки (иногда) для получения разрешений. При использовании более старого SDK иногда (казалось, случайным образом пользователем) некоторые пользователи получали "Исключение OAuthException: (#412) Пользователь не установил приложение", хотя проверка отладчика маркеров доступа FB показала надлежащие разрешения. После того, как я обновил новый SDK и придумал новый способ получения простого списка данных разрешения, все снова заработало.

Мне потребовалось много копаться на веб-сайте FB, чтобы найти это решение, поэтому я вставляю его сюда, чтобы, надеюсь, сэкономить кому-то еще несколько часов. Они действительно спасли жизнь, когда я открыл метод getDecodedBody (очень трудный трюк в документах FB). Мой пример просто проверяет наличие publish_actions.

$fb = new Facebook\Facebook([
    'app_id' => your_app_id,
    'app_secret' => your_secret,
    'default_graph_version' => 'v2.2',
 ]);

$badperms=true; //start by assume bad permissions

try {
    $response = $fb->get('/me/permissions', $at);
    $perms = $response->getDecodedBody();

    if($badperms){
        foreach($perms['data'] AS $perm){
            if($perm['permission']=='publish_actions' && $perm['status']=='granted') $badperms=false;
        }
    }

} catch(Facebook\Exceptions\FacebookResponseException $e) {
    log("MSG-received facebook Response exception!! ".$e->getMessage());
} catch(Facebook\Exceptions\FacebookSDKException $e) {
    log("MSG-received facebook SDK exception!! ".$e->getMessage());
}

if($badperms) {
    //do something like reflow auth
}
 0
Author: tpneumat, 2015-10-06 23:55:07

У меня просто была та же проблема, я не знал, как относиться к действию отмены (как в php api facebook, так и в google oauth2).

Решение намного проще, чем ожидалось.

Ответ в случае, если разрешение не принято (вообще), приходит по крайней мере с одним параметром/переменной: ошибка в URL.

В facebook этот ответ выглядит так:

Error=access_denied&error_code=200&error_description=Permissions+error&error_reason=user_denied

Для Google вы получаете только

Ошибка=доступ запрещен

Но этого должно быть достаточно.

Я просто проверяю, установлена ли ошибка, и если она установлена, я перенаправляю ответ на свою страницу входа.

Я надеюсь, что это кому-то поможет, потому что на самом деле этот шаг не задокументирован. Между прочим: версия API facebook: версия v5 API google OAuth2: 2.0 (я думаю, что google doc - это действительно беспорядок, когда дело доходит до поиска последних версий)

 0
Author: Daniel, 2015-12-22 13:13:42