Aplicația Facebook Canvas - Redirectare prin conectare circulară

Folosesc șablonul Social Cookbook bazat pe Python pentru a crea o aplicație Facebook , dar am o problemă cu Suport pentru canvas care face o POST în loc de GET . Exemplul de carte de preparare nu include modul de abordare a acestei situații. Bazându-vă pe acest exemplu Hello World și uitandu-mă la exemplul Run With Friends , pot obține cererea semnată, citiți datele (id utilizator, jeton) și setați metoda la GET.

Cu toate acestea, pe măsură ce continuă, serverul Browser/Tornado intră într-o buclă în care se execută în mod repetat LoginHandler. Dă-mi o eroare "Firefox a detectat că serverul redirecționează cererea pentru această adresă într-un mod care nu va fi niciodată finalizat". Am încercat să-mi dau seama de asta două zile și m-am gândit dacă cineva ar putea ajuta - ar fi StackOverflow. Vă mulțumim pentru orice îndrumare pe care ați putea să o furnizați în modificarea cărții de bucate sociale pentru a vă sprijini pe Facebook Canvas.

class BaseHandler(tornado.web.RequestHandler):

    def initialize(self):
        self.init_facebook()

    def init_facebook(self):
        # initial facebook request comes in as a POST with a signed_request
        signed_request = self.get_argument('signed_request', None)
        if signed_request and self.request.method == u'POST':
            app_secret = options.facebook_app_secret
            data = load_signed_request(signed_request, app_secret)
            user_id = data.get(u"user_id")
            mytoken = data.get(u"oauth_token")
            print mytoken
            self.set_secure_cookie("uid", user_id)
            self.request.method = u'GET'  # causes loss of request.POST data
0

1 răspunsuri

Ok, deci iată ce am făcut (datorită ajutorului de la oDesk - Haiming Yin) și care au fost unele dintre problemele mele. Pentru unul, sistemul care rulează FireFox pe Mac a fost dezactivat. Acest lucru va provoca probleme cu Facebook Canvas. În IE, trebuie să setați antetele corespunzătoare P3P. Deci toate astea se combină pentru o bună durere de cap.

class BaseHandler(tornado.web.RequestHandler):
    @property
    def prepare(self):
        self.set_header('P3P', 'CP="HONK"')

    def initialize(self):
        if self.request.full_url() == "http://mydomain/a/facebook/":
            self.request.protocol = "https"
        self.init_facebook()

    def init_facebook(self):
        """Sets up the request specific Facebook and User instance"""

        # initial facebook request comes in as a POST with a signed_request
        signed_request = self.get_argument('signed_request', None)
        if signed_request and self.request.method == u'POST':
            app_secret = options.facebook_app_secret
            data = load_signed_request(signed_request, app_secret)
            user_id = data.get(u"user_id")
            if user_id:
                self.set_secure_cookie("uid", user_id)
            self.request.method = u'GET'

class FacebookCanvasHandler(HomeHandler):
    def get(self, *args, **kwds):
        logging.info("Facebook Canvas called.")
        if not self.current_user:
            logging.info("Need user grant permission, redirect to oauth dialog.")
            logging.info(self.settings.get("facebook_canvas_id"))
            oauth_url = self.get_login_url(self.settings.get("facebook_canvas_id"))
            logging.info(oauth_url)
            self.render("canvas_oauth.html", oauth_url=oauth_url)
        else:
            super(FacebookCanvasHandler, self).get(*args, **kwds)

def load_signed_request(signed_request, app_secret):
    try:
        sig, payload = signed_request.split(u'.', 1)
        sig = base64_url_decode(sig)
        data = json.loads(base64_url_decode(payload))

        expected_sig = hmac.new(app_secret, msg=payload, digestmod=hashlib.sha256).digest()

        if sig == expected_sig and data[u'issued_at'] > (time.time() - 86400):
            return data
        else:
            return None
    except ValueError, ex:
        return None

def base64_url_decode(data):
    data = data.encode(u'ascii')
    data += '=' * (4 - (len(data) % 4))
    return base64.urlsafe_b64decode(data)

canvans_oauth.html



<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>
        Page Title
    </title>
    <meta name="description" content="description of the page" /><meta name="keywords" content="" /><meta name="viewport" content="width=device-width" />
    <link rel="icon" type="image/png" href="/static/favicon.ico" />
    <script>
        window.top.location = "{% raw oauth_url %}";
    </script>

</head>

<body id="inner_body" class="inner_body">
redirecting to oauth...
</body>
</html>
0
adăugat
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.