ASP.NET и Facebook Connect - Как опубликовать на стене пользователя, используя Graph API? - PullRequest
1 голос
/ 26 июля 2010

Я интегрировал свой сайт с Facebook Connect, авторизация / единый вход - все отлично работает.

Теперь я пытаюсь опубликовать что-то на стене пользователя, с чем у меня возникают проблемы.

Прежде всего, я использую «старый» JavaScript API (FeatureLoader.js).

Это URL API Graph, которые я использую:

private const string UserDetails_Url = @"https://graph.facebook.com/{0}?access_token={1}";
private const string Feed_Url = @"https://graph.facebook.com/{0}/feed?access_token={1}";
private const string TokenExchange_Url = @"https://graph.facebook.com/oauth/access_token?{0}";

Я использую URL TokenExchange_Url для получения уникального пользовательского токена OAuth для совершения звонков.

Это работает нормально, потому что a) я получаю токен обратно, и b) я могу выдавать HTTP Get Requests в API Graph (т.е. UserDetails_Url), и он отлично работает.

Но я не могу опубликовать сообщение на стене пользователя, используя Feed_Url.

Я почти уверен, что проблема в том, что у меня нет соответствующих прав пользователя для публикации на стене (т.е. настройка на стороне Facebook).

Теперь я понимаю, что для этого могу использовать метод API fbPublish на стороне клиента, но я хочу сделать это на стороне сервера с Graph API.

Я не буду показывать мой код, который пытается вызвать API-интерфейс Graph для публикации на стене пользователя, как его довольно просто (HttpWebRequest, установить метод в «POST», установить тип / длину содержимого, записать байты в Stream и т. Д.) ).

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

API Graph Facebook doco говорит сделать это в вашем запросе авторизации:

https://graph.facebook.com/oauth/authorize?
    client_id=...&
    redirect_uri=http://www.example.com/callback&
    scope=user_photos,user_videos,publish_stream

Что меня смущает, потому что я использую следующий URL для получения токена OAuth:

https://graph.facebook.com/oauth/access_token?bunchofqsparams

Использую ли я неправильный URL токена? Почему существуют два разных URL-адреса, по-видимому, для получения одной и той же информации?

Да - я читал документацию по API Facebook (много раз), и да, я читал другие подобные вопросы SO, но все они приводят к использованию API на стороне клиента для публикации на стене, я хочу сделать это на стороне сервера .

Для кнопки «Facebook Connect» я использую стандартный FBML:

<fb:login-button length="long" size="medium" autologoutlink="false" background="light" onlogin="facebookLogin('/login')" class=" fb_login_not_logged_in FB_login_button FB_ElementReady"><a id="RES_ID_fb_login" class="fbconnect_login_button"><img id="RES_ID_fb_login_image" src="http://static.ak.fbcdn.net/rsrc.php/zB6N8/hash/4li2k73z.gif" alt="Connect"></a></fb:login-button>

Когда я нажимаю на это (и не вошел в Facebook), появляется окно, в которое пользователь может войти. Но у него нет диалогового окна «Запрос расширенных разрешений» - не так ли? Или это другое всплывающее окно, которое мне нужно вызвать вручную?

Итак, подведем итог, вот мои вопросы:

  • Как предоставить расширенные разрешения для публикации на стене пользователя?
  • Какой правильный URL-адрес для получения токена OAuth?
  • Есть ли точный источник информации о том, как размещать сообщения на стене пользователя с помощью вызовов API API на стороне сервера?

1 Ответ

4 голосов
/ 26 июля 2010

Как я и предполагал, мне не хватало вызова клиентского API для запроса расширенных разрешений. (т. е. publish_stream).

У меня была простая функция JavaScript, которая выполнялась как часть атрибута «onlogin» элемента управления FBML Login.

Раньше я просто делал перенаправление (которое затем делало бы единый вход в серверный код).

Теперь я делаю это:

function postLogin(targetUrl) {
   FB.Facebook.apiClient.users_hasAppPermission('publish_stream', function(result) {
        if (result == 0 || result == null) {
            FB.Connect.showPermissionDialog('publish_stream', function() { redirectTo(targetUrl); });
        } else {
            redirectTo(targetUrl);
        }
    });
}

Перевод на английский:

// On "Facebook Connect" click (which passes in a redirect URL)
// Check if user has 'publish-stream' permissions
// If they do, just redirect.
// If they dont, show a dialog requesting that permission, then redirect.

Теперь все вызовы API на стороне сервера работают нормально.

Итак, чтобы ответить на мои собственные три вопроса:

  • Как предоставить расширенные разрешения для публикации на стене пользователя?

Ответ: использовать клиентскую функцию JavaScript API 'FB.Connect.showPermissionDialog', чтобы показать всплывающее окно, и 'FB.Facebook.apliClient.users_hasAppPermission', чтобы проверить, есть ли у них разрешение .

  • Какой правильный URL-адрес для получения токена OAuth?

Ответ: Я все еще считаю, что это "https://graph.facebook.com/oauth/access_token?{0}",, но " https://graph.facebook.com/oauth/authorize?{0}" может быть использовано для процесса аутентификации / авторизации на стороне сервера.

  • Существует ли точный источник информации о том, как размещать сообщения на стене пользователя с помощью вызовов API API на стороне сервера?

* 1042. =)

Советую всем, кто начинает работу над Facebook Connect, старайтесь избегать «старого JavaScript API». Делайте как можно больше на стороне сервера (Graph API) и используйте только клиентский JavaScript API для начального рукопожатия (междоменный получатель).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...