我想知道如何用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。
请赐教。 顺便提一下,我目前正在使用本地计算机工作。
最诚挚的问候。
答案 0 :(得分:1)
您必须在该端点上禁用CSRF检查,因为请求来自Facebook而非您自己的网站
http://www.tornadoweb.org/documentation#cross-site-request-forgery-protection