iframe画布应用程序的Facebook OAuth登录显示徽标图像和Go to Facebook.com标题,而不是登录

aba*_*gat 15 authentication facebook oauth

我正在尝试设置我的(iframe)Facebook应用程序以使用OAuth进行身份验证.我使用了Facebook 的python-sdk,但我对结果并不满意.

问题是,当我将从未访问过我的应用程序的用户重定向到登录页面时,我的iframe会显示一个丑陋的中间页面,例如以下页面:

我正在获取的页面

如果用户点击"转到Facebook.com"链接,则会将其重定向到标准的"请求权限"页面.

标准的权限请求页面

有没有办法避免第一页并引导用户直接进入第二页?

对于尚未向我的应用程序授予任何权限的用户,首次访问时会出现此问题.

登录代码基于Python SDK中的OAuth示例:

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))
Run Code Online (Sandbox Code Playgroud)

aba*_*gat 10

这个问题是由Facebook用来淘汰iframe的代码造成的.在Facebook的bugzilla上提交了一个错误: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>
Run Code Online (Sandbox Code Playgroud)

当用户点击某个元素(例如登录按钮)或每次访问特定页面时(只需将其包含在HTML头中),就可以触发此操作.