Facebook OAuth login для приложений холста iframe отображает изображение логотипа и заголовок Facebook на Facebook.com вместо входа в систему

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

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

The page I'm getting

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

Standard Request for Permission page

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

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

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

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))

Ответ 1

Проблема вызвана тем, что код Facebook использует для изъятия из iframes. Ошибка на bugzilla 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).

Ответ 2

Это происходит, по-видимому, из-за ошибки на стороне 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>

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

Ответ 3

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

Ответ 4

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