Как авторизовать приложение Facebook с помощью перенаправления на холсте? - PullRequest
6 голосов
/ 01 августа 2010

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

Используя javascript api, я довольно легко заработал во всплывающей схеме:

$("#loginButton").click(function(e) {
    FB.login(function(response) {
        if (response.perms) {
            perms();
        }
}, {perms : 'publish_stream'});

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

http://i.imgur.com/yBGzL.png

Я полагаю, они просто используют схему перенаправления. Поэтому я потратил весь день, пытаясь найти разные способы:

header("Location: https://graph.facebook.com/oauth/authorize?client_id=" . $gAppId . "&redirect_uri=" . urlencode($gUrl) . "&perms=publish_stream");

header("Location: http://www.facebook.com/login.php?v=1.0&api_key=" . $gApiKey . "&next=" . urlencode($gUrl) . "&canvas=");

header("Location: http://www.facebook.com/connect/uiserver.php?app_id=" . $gAppId . "&next=" . urlencode($gUrl) . "&return_session=0&fbconnect=0&canvas=1&legacy_return=1&method=permissions.request");

Но все они, вместо того, чтобы показывать запрос на авторизацию, показывают такую ​​ссылку:

http://i.imgur.com/bLwPQ.png

Весело, если я открою адрес iframe в новой вкладке, я получу запрос на авторизацию, как я хотел. Но я хочу, чтобы он отображался немедленно, без дополнительного клика, как и любое другое приложение.

Вот пример приложения, которое выполняет авторизацию и запрашивает разрешения за один раз, в форме перенаправления, даже до отображения целевой страницы:

www.facebook.com / send.fortune.cookies

Как они это делают?

Ответы [ 4 ]

10 голосов
/ 03 ноября 2010

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

6 голосов
/ 01 августа 2010

Проблема в том, что перенаправление на стороне сервера только перенаправляет ваш внутренний фрейм приложения, а не перенаправляет всю страницу, а Facebook не нравится отображать свои системные диалоги внутри фреймов.

Вам понадобится некоторое перенаправление на стороне клиента, возможно, что-то вроде этого:

<script>
    <?php 
        if($doRedirect) {
            echo 'top.location="http://redirect_url";';
        }
    ?>
</script>
1 голос
/ 27 марта 2012

Используя FB Javascript SDK, это можно сделать что-то вроде -

FB.getLoginStatus(function(response) {
      if (response.status === 'connected') {
         loggedIn(response);
      } else {
        top.location = encodeURI("https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_APP_URI&response_type=token");
      }
0 голосов
/ 16 декабря 2010

Может быть, это поможет:

    if(!$facebook->api_client->users_isAppUser())
{
    ?>
    <fb:redirect url="http://www.facebook.com/login.php?v=1.0&api_key=111111111111&next=http%3A%2F%2Fapps.facebook.com%2Fapp_name%2F&canvas=&req_perms=publish_stream"/>
    <?php
}
...