在 Django Rest Framework 中对来自我的网站的 Ajax 请求进行权限绕过

Posted

技术标签:

【中文标题】在 Django Rest Framework 中对来自我的网站的 Ajax 请求进行权限绕过【英文标题】:Make permission bypass for Ajax requests from my website in Django Rest Framework 【发布时间】:2021-01-18 22:33:33 【问题描述】:

我已获得此 API 权限

def has_permission(self, request, view):
    return request.user.is_authenticated and (
       request.user.is_superuser or
       models.AllowedToUseAPIList.objects.filter(user=request.user).exists()
)

我检查是否将请求 API 的用户添加到 AllowedToUseAPIList 列表中。 但我还需要从本网站的其他页面向此 API 发出 AJAX 请求。 如何更改权限以允许这样做? 我还将我的 CSRF 令牌传递给 AJAX 调用,但得到 403。

我这样进行 Ajax 调用:

let csrf = $("input[name='csrfmiddlewaretoken']").val();
...
$.ajax(
    url:"% url 'api:ajax_api:save-mark' %",
    method: 'POST',
    data:
        "csrfmiddlewaretoken": csrf,
        "name": that.name,
        "value": value,
        ,
    success: function (data)
        ...
    
)

毕竟,我得到 403 Permission Denied。

【问题讨论】:

你能分享你的ajax请求和错误本身吗? @Daniel 查看编辑 csrf 令牌是否存在问题 - 是否正确传递?即错误是否说缺少或不正确的 csrf 令牌? @Daniel 是的,没错。问题不在于传递 csrf - 而是让我的权限绕过 Ajax 调用,但对任何其他用户保持真实。 不确定我是否仍然理解 - 但以下是绕过 csrf 令牌的一种方法。 【参考方案1】:

尝试添加一个参数来告诉视图何时允许绕过:

js:

$.ajax(
    url:"% url 'api:ajax_api:save-mark' %",
    method: 'POST',
    data:
        "csrfmiddlewaretoken": csrf,
        "name": that.name,
        "value": value,
        "bypass" : true, // add this parameter
        ,
    success: function (data)
        ...
    
)

蟒蛇:

def has_permission(self, request, view):

    # check if request was triggered by ajax:
    ajax_bypass = 'bypass' in request.POST and request.POST['bypass']

    # check if use is a superuser:
    user_is_superuser = request.user.is_superuser

    # check if user is in allowed list:
    user_is_authorized = models.AllowedToUseAPIList.objects.filter(user=request.user).exists()

    return ajax_bypass or user_is_superuser or user_is_authorized

【讨论】:

我认为没关系,但我得到了最好的解决方案 - 只是关闭可浏览的 API

以上是关于在 Django Rest Framework 中对来自我的网站的 Ajax 请求进行权限绕过的主要内容,如果未能解决你的问题,请参考以下文章

django使用rest_framework

Django Rest Framework

Django rest framework 身份和权限验证

Django Rest Framework:非模型服务

django-rest-framework - 在可浏览的 API 中自动生成表单?

在 django-rest-framework 中,是不是可以同时使用 oauth 和 session 身份验证?