Facebook帖子“ signed-request”中缺少CSRF令牌

问题描述 投票:1回答:3

我正在处理Django项目。目的是从Facebook导入用户信息。首先,我使用Facebook提供的注册社交插件。我有一个基本模板,其中包括用于注册插件的iframe;就像Facebook api文档所建议的那样。呈现此模板的视图如下:

def registration(request):
    if (request.method == "POST"): 
        return HttpResponse("it posted!")
    else: 
        return render_to_response("ui/registration.html", {}, 
                                  context_instance=RequestContext(request))

当我在插件上按注册时,Facebook将签名请求发送给我的视图时,Django抱怨缺少csrf令牌。我还尝试通过使用csrf(request)将其传递到上下文字典中来显式地包含csrf令牌,但是仍然不能解决问题。

django facebook csrf
3个回答
3
投票

CSRF保护用于防止跨站点发布。但是,在这种情况下,您希望接受来自Facebook的帖子,因此您应该在接受已签名请求的视图上使用csrf_exempt装饰器。请参阅关于CSRF异常的部分:http://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#exceptions


1
投票

您需要为此做几件事:

  1. 您需要将csrf令牌作为参数传递给您的Facebook请求,如其documentation的结尾所示:
  2. 接下来,您将必须用@csrf_exempt装饰视图,如Mark所建议。
  3. 最后,在您看来,您可以验证csrf令牌是否正确。您可以通过查看here找到的django csrf中间件代码来窃取一些逻辑。
  4. 或者,您可以编写自己的中间件来检查来自facebook的csrf令牌,而不是步骤2和3。

寻找fandjango应用,尤其是中间件。https://github.com/jgorset/fandjango对我做到了


1
投票

寻找fandjango应用,尤其是中间件。https://github.com/jgorset/fandjango对我做到了

© www.soinside.com 2019 - 2024. All rights reserved.