Facebook OAuth-логин для приложений холста iframe отображает изображение логотипа и надпись Go to Facebook.com вместо входа в систему - PullRequest
15 голосов
/ 13 ноября 2010

Я пытаюсь настроить приложение Facebook (iframe) на использование OAuth для аутентификации.Я использовал python-sdk от Facebook, но пока не очень удовлетворен результатом.

Проблема в том, что когда я перенаправляю пользователя, который никогда не обращался к моему приложению, вСтраница входа, мой iframe отображает уродливую промежуточную страницу, такую ​​как следующая:

The page I'm getting

Если пользователь нажимает на ссылку «Перейти на Facebook.com», она затем перенаправляетсяна стандартную страницу «Запрос на разрешение».

Standard Request for Permission page

Есть ли способ избежать первой страницы и привести пользователя прямо ко второй?

Эта проблема возникает при первом доступе пользователей, которые еще не предоставили никакого разрешения моему приложению.

Код входа в систему основан на примере OAuth в Python SDK:

class LoginHandler(BaseHandler):
    def get(self):
        verification_code = self.request.get("code")
        args = dict(client_id=FACEBOOK_APP_ID, redirect_uri=self.request.path_url)
        if self.request.get("code"):
            args["client_secret"] = FACEBOOK_APP_SECRET
            args["code"] = self.request.get("code")
            raw_response = urllib.urlopen(
                "https://graph.facebook.com/oauth/access_token?" +
                urllib.urlencode(args)).read()
            logging.debug("access_token raw response " + raw_response)
            response = cgi.parse_qs(raw_response)
            access_token = response["access_token"][-1]

            # Download the user profile and cache a local instance of the
            # basic profile info
            graph = facebook.GraphAPI(access_token)
            profile = graph.get_object("me")

            user = User.get_by_key_name(profile["id"])
            if not user:
                user = User(key_name=str(profile["id"]),
                                id=str(profile["id"]),
                                name=profile["name"],
                                firstname=profile["first_name"],
                                profile_url=profile["link"],
                                access_token=access_token)
                user.put()
            elif user.access_token != access_token:
                # we already know this user, but we need to update
                user.access_token = access_token
                user.put()

            set_cookie(self.response, "fb_user", str(profile["id"]),
                       expires=time.time() + 30 * 86400)

            self.response.headers["P3P"] = 'CP="IDC CURa ADMa OUR IND PHY ONL COM STA"'
            self.redirect("/")
        else:
            self.redirect(
                "https://graph.facebook.com/oauth/authorize?" +
                urllib.urlencode(args))

Ответы [ 4 ]

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

Проблема связана с кодом, который Facebook использует для выгрузки из фреймов.В багзилле Facebook было зарегистрировано сообщение об ошибке: http://bugs.developers.facebook.net/show_bug.cgi?id=11326

Единственное известное решение этой проблемы - это сделать первый редирект на https://graph.facebook.com/oauth/authorize? со стороны клиента (т.е. через JavaScript), используя

 <script type='text/javascript'>
 top.location.href="https://graph.facebook.com/oauth/authorize?.......
 </script>

Это может быть вызвано, когда пользователь нажимает на какой-либо элемент (например, кнопку входа в систему) или когда посещается определенная страница (просто включите ее в заголовок HTML).

1 голос
/ 20 мая 2011

да, top.location.href должен сделать свое дело. Если у вас возникла проблема с тем, что приложение нарушает работу iframe, убедитесь, что вы используете URL-адрес canvas PAGE в своем перенаправлении вместо вместо URL-адреса canvas (в настройках вашего приложения)

1 голос
/ 25 января 2011

Это происходит, по-видимому, из-за ошибки на стороне Facebook ... Я нашел это решение.

<script type="text/javascript"> 
  top.location.href = '<?php echo $loginUrl ?>';
</script>

$loginUrl = your URL

Может работать так:

<script type="text/javascript"> 
  top.location.href = 'http://www.yourappUrl.com';
</script>

всегда используйте этот кодв тегах скрипта ...

0 голосов
/ 14 ноября 2010

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

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