Facebook Canvas iFrame App - авторизация пользователей с новым протоколом OAuth - PullRequest
4 голосов
/ 29 апреля 2010

Я разрабатываю новое приложение Facebook Canvas в iFrame и пытаюсь авторизовать пользователей. Новый API OAuth рекомендует перенаправить пользователя в мое приложение следующим образом:

https://graph.facebook.com/oauth/authorize? client_id = ... & redirect_uri = http://www.example.com/oauth_redirect

Однако это создает странную проблему, когда полная страница Facebook, запрашивающая разрешения у пользователя, отображается в самом iFrame (т.е. в Facebook в Facebook). Кто-нибудь знает, как решить эту проблему с помощью нового OAuth API, поскольку я не хочу начинать использовать старые методы REST API.

Ответы [ 6 ]

0 голосов
/ 09 июля 2012

Вы не можете сделать простое перенаправление 302 или 301 внутри холста iframe, так как это будет перенаправлять только контент внутри iframe. Facebook рекомендует отправить небольшой кусочек JavaScript, который установит top.location на страницу диалогового окна / oauth.

<script>top.location='https://www.facebook.com/dialog/oauth?client_id={0}&redirect_uri={1}&scope=publish_actions';</script>.

clientid - ваш AppId, а redirect_uri - страница, которая обрабатывает перенаправление со страницы диалога авторизации.

0 голосов
/ 07 апреля 2011

Попробуйте эту статью http://novacoders.blogspot.com/2011/04/facebook-apps-oauth-20-authorization.html

Если вы не используете какой-либо веб-сервер, вам нужно использовать Javascript SDK. FB.init () возвращает все необходимые данные, такие как access_token.

0 голосов
/ 12 января 2011

есть еще один способ сделать это с oAuth v2, и это описано в документации на Facebook, но разбито на несколько страниц, поэтому его нелегко понять.

Во-первых, вам нужно активировать флаг «OAuth 2.0 for Canvas» в «дополнительных параметрах» вашего приложения.

А затем, вот пример PHP, объясняющий, как с этим справиться:

function parse_signed_request($signed_request, $secret) {
    list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

    // decode the data
    $sig = base64_url_decode($encoded_sig);
    $data = json_decode(base64_url_decode($payload), true);

    if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
            error_log('Unknown algorithm. Expected HMAC-SHA256');
            return null;
    }

    // check sig
    $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
    if ($sig !== $expected_sig) {
            error_log('Bad Signed JSON signature!');
            return null;
    }

    return $data;
}

function base64_url_decode($input) {
    return base64_decode(strtr($input, '-_', '+/'));
}

$data = parse_signed_request($_REQUEST["signed_request"], <your facebook app api secret>);

if (empty($data["user_id"]) && !isset($_REQUEST['redir'])) {
    // The user isn't authenticated
    $auth_url = "http://www.facebook.com/dialog/oauth?client_id=" .
            <your facebook app id> . "&redirect_uri=" .
            urlencode('http://apps.facebook.com/<yourapp>/?redir=1');
    echo("<script> top.location.href='" . $auth_url . "'</script>");
    die;
}
// Here the user is authenticated
echo ("Welcome User: " . $data["user_id"]);
// And now you have the Graph API auth token in $data["oauth_token"],
// so you can use any graph api method
0 голосов
/ 21 мая 2010

Последние два дня боролись с этим и нашли решение этой проблемы на форуме разработчиков Facebook .

0 голосов
/ 04 мая 2010

Наоборот, я нашел решение этой проблемы, которое я изложил в своем блоге здесь . Проверьте это.

0 голосов
/ 30 апреля 2010

Даже у меня была такая же проблема, и я разместил ее на форуме в Facebook. Модератор сообщил мне, что это проблема, для которой пока нет решения. Взгляните на эту тему - http://forum.developers.facebook.com/viewtopic.php?id=56590

...