Проблема доступа к Facebook - PullRequest
1 голос
/ 22 июля 2011

Я использую диалог запроса в своем приложении, где пользователь может отправлять запросы своим друзьям.Как только пользователь отправляет запрос, я перенаправляю приложение на страницу, где оно публикуется на странице пользователя.Я использую приведенный ниже код для получения access_token:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://graph.facebook.com/oauth/access_token?client_id='.APP_ID.'&client_secret='.APP_SECRET.'&redirect_uri=http://www.facebook.com/pages/Cosmetics/167231286678063?sk=app_233227910028874&grant_type=client_credentials');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);

$token = curl_exec($ch);

$me = $facebook->api('/me?'.$token);

, но когда я пытаюсь опубликовать сообщение на стене, он показывает эту ошибку:

Неустранимая ошибка: Uncaught OAuthException: Неверная подпись токена доступа OAuth,

Ответы [ 4 ]

2 голосов
/ 22 июля 2011

Я не уверен в том, как именно вы пытаетесь аутентифицироваться. Возможно, вы выполняете запрос таким образом, но метод, который я использую, описан здесь: http://developers.facebook.com/docs/authentication/

То есть сначала вы перенаправляете пользователя на страницу Facebook, чтобы заставить его принять разрешения. Как только он соглашается, он перенаправляется на указанный вами URL с аргументом code=### get, который вам необходим для выполнения запроса на стороне сервера, чтобы получить нужный вам access_token ..

Пример URL перенаправления:

$my_url = 'http://www.example.com';
"http://www.facebook.com/dialog/oauth?client_id=". $app_id ."&redirect_uri=". urlencode($my_url);

Затем, когда пользователь нажимает кнопку «Принять», он перенаправляется, например, на

.
http://www.example.com?code=ABCDEF

Затем, на стороне сервера, вам нужно получить access_token, который делает такой вызов:

"https://graph.facebook.com/oauth/access_token?"
   . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
   . "&client_secret=" . $app_secret . "&code=" . $code;

Затем дважды проверьте возвращенный текст этого вызова и попробуйте получить

"https://graph.facebook.com/me?access_token=". $access_token;

(Вы также можете проверить это вручную)

EDIT

Кроме того, вам, вероятно, потребуются дополнительные разрешения от пользователя для публикации в его потоке. Итак, запросите разрешения, добавив scope=publish_stream get к первому (авторизация пользователя) URL.

1 голос
/ 23 июля 2011

Почему вы не используете PHP SDK 3.0.1?

Это просто, если вы используете SDK, предоставленный Facebook, вот пример для аутентификации с использованием php SDK 3.0.1:

<?php

// Requires Facebook PHP SDK 3.0.1: https://github.com/facebook/php-sdk/
require ('facebook.php');

define('FACEBOOK_APP_ID',"YOUR-APP-ID-HERE");
define('FACEBOOK_SECRET',"YOUR-APP-API-SECRET-HERE");
define('REDIRECT_URI',"YOUR-REDIRECT-URL-HERE");
define('PERMISSIONS_REQUIRED', "publish_stream,user_photos");
$user = null;

$facebook = new Facebook(array(
    'appId' => FACEBOOK_APP_ID,
    'secret' => FACEBOOK_SECRET,
    'cookie' => true
));

$user = $facebook->getUser(); // Get the UID of the connected user, or 0 if the Facebook user is not connected.

if($user == 0) {
    // If the user is not connected to your application, redirect the user to authentication page
    /**
     * Get a Login URL for use with redirects. By default, full page redirect is
     * assumed. If you are using the generated URL with a window.open() call in
     * JavaScript, you can pass in display=popup as part of the $params.
     * 
     * The parameters:
     * - redirect_uri: the url to go to after a successful login
     * - scope: comma separated list of requested extended perms
     */

    $login_url = $facebook->getLoginUrl($params = array('redirect_uri' => REDIRECT_URI,'scope' => PERMISSIONS_REQUIRED));

    echo ("<script> top.location.href='".$login_url."'</script>");

} else {
    // if the user is already connected, then fetch access_token and user's information or show some content to logged in user.
    try
    {
        $access_token = $facebook->getAccessToken(); // Gives you current user's access_token

        $user = $facebook->api('/me'); // Gets User's information based on permissions the user has granted to your application.

    } catch(FacebookApiException $e){
        $results = $e->getResult();
        // Print results if you want to debug.
    }

}

?>
1 голос
/ 22 июля 2011

Вы используете &grant_type=client_credentials, который дает вам токен доступа для вашего приложения в целом, а не для вашего текущего пользователя. Чтобы получить токен доступа для вашего текущего пользователя, вам нужно перенаправить его на тот же URL-адрес, но без &grant_type=client_credentials, а затем Facebook перенаправит их обратно на ваш redirect_uri и отправит вам нужный access_token. В качестве альтернативы вы можете использовать Javascript SDK для получения токена доступа через всплывающее окно без их перенаправления.

Вот ссылка на другой вопрос о том, как пройти аутентификацию с помощью JS SDK и без перенаправления: Аутентификация Facebook без перенаправления?

0 голосов
/ 22 июля 2011

То, что вы делаете, - это получение токена доступа к приложению :

Вход в приложение позволяет вам выполнять различные административные действия для вашего приложения, такие как получение данных Insights или утверждениеЗапросы.Вызовы API Graph, для которых требуется токен доступа к приложению, четко обозначены в справочнике по API.

Вам нужен токен доступа пользователя с некоторыми разрешениями ,в вашем случае это будет publish_stream.

...