Django:Facebook帖子'signed-request'中缺少CSRF令牌

时间:2011-04-07 14:34:11

标签: django facebook csrf

我正在使用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-token,但是这仍然无法解决问题。我们将非常感谢您的快速反应。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

你需要为此做一些事情:

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

答案 2 :(得分:1)

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