使用Facebook注册插件的龙卷风

时间:2011-01-07 08:19:13

标签: facebook tornado

Facebook发布了这里的注册插件 几周前http://developers.facebook.com/docs/user_registration

我想知道如何用Tornado实现这个目标?

我一直收到错误:403 POST / auth / fbform(127.0.0.1):POST中缺少'_xsrf'参数

redirect_url是http://localhost:8888/auth/fbform 代码如下:

class FBFormLoginHandler(BaseHandler, tornado.web.RequestHandler):
    def get(self):
        print "i'm in GET"
        print self.request
        # parse and check data
        data = _parse_signed_request(self.request['_xsrf'], "XXXXX")
        return
    def post(self):
        print "i'm in POST"
        print self.request
        # parse and check data
        data = _parse_signed_request(self.request['_xsrf'], "XXXXX")
        return

    def _parse_signed_request(signed_request, app_secret):
        print "hello in parse_signed_request"
        try:
          l = signed_request.split('.', 2)
          encoded_sig = str(l[0])
          payload = str(l[1])
        except IndexError:
          raise ValueError("'signed_request' malformed")

        sig = base64.urlsafe_b64decode(encoded_sig + "=" * ((4 - len(encoded_sig) % 4) % 4))
        data = base64.urlsafe_b64decode(payload + "=" * ((4 - len(payload) % 4) % 4))

        data = json.loads(data)

        if data.get('algorithm').upper() != 'HMAC-SHA256':
          raise ValueError("'signed_request' is using an unknown algorithm")
        else:
          expected_sig = hmac.new(app_secret, msg=payload, digestmod=hashlib.sha256).digest()

        if sig != expected_sig:
          raise ValueError("'signed_request' signature mismatch")
        else:
          return data

我不明白错误消息正在谈论哪个POST,所以 我试图使用get和post函数中的_parse_signed_request。

请赐教。 顺便提一下,我目前正在使用本地计算机工作。

最诚挚的问候。

1 个答案:

答案 0 :(得分:1)

您必须在该端点上禁用CSRF检查,因为请求来自Facebook而非您自己的网站

http://www.tornadoweb.org/documentation#cross-site-request-forgery-protection