使用django-rest-framework和Ajax实现SessionAuthentication?

时间:2015-11-25 17:10:05

标签: ajax django django-rest-framework

我有一个仅支持GET请求的RESTful API。它与我的前端运行在同一个域中。所有这些都在Django 1.8和DRF 3.2.2中。

然后我有一个前端pure-JS应用程序,它对API进行Ajax调用。举个例子,我有一个包含一些自动填充字段的表单。这些字段也将预先填充,具体取决于页面加载的哈希参数。通过查询API获得这些表单字段的值。

(对于后台,该应用程序没有用户概念,也不需要任何登录或身份验证方法,除了我想让API仅适用于我的JS应用程序。)

现在,我想修改API以使用SessionAuthentication。我有两个问题:(1)如何在Django中设置它? (2)我如何修改我的JS代码?

问题(1),我已更新我的设置文件以包含SessionAuthentication:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
    )
}

但是现在,API似乎仍然可供任何人使用。我需要它只能 到我的API。

问题(2),这是我目前针对Select2自动完成字段的Ajax设置:

    ajax: {
            url: "/api/1.0/bnf_code/",
            dataType: 'json',
            delay: 50,
            data: function (params) {
              return {
                q: params.term,
                page: params.page

              };
            },
            processResults: function (data, params) {
                // do stuff
            },
            cache: true
        }

这是预先填充自动填充字段值的代码。

        return $.ajax({
            type: 'GET',
            url: url,
            dataType: 'json',
            context: this
        });

一旦我设置了SessionAuthentication,我该如何修改这些?

1 个答案:

答案 0 :(得分:1)

1

您需要更改permission policy

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

默认值为'rest_framework.permissions.AllowAny'

2

要对AJAX请求进行身份验证,请将withCredentials字段添加到每个AJAX请求中:

$.ajax({
  url: a_cross_domain_url,
  xhrFields: {
    withCredentials: true # <----
  }
})