gpt4 book ai didi

带有 CSRF/CORS 的带有 TokenAuthentication 问题的 Django REST 框架

转载 作者:行者123 更新时间:2023-12-04 13:46:00 26 4
gpt4 key购买 nike

我在 Django REST Framework 中使用 TokenAuthentication 来让脚本远程访问我的 API。运行 API 的域位于 TLS 证书之后。

我已经搜索了许多来源,并在来这里之前尝试了很多选择来弄清楚我的问题是什么。总之,我不断得到CSRF verification failed. Request aborted.当我尝试发布时出错。

这是我的观点:

# @csrf_exempt
@api_view(['POST'])
@authentication_classes((TokenAuthentication,))
@permission_classes((permissions.IsAuthenticated,))
def create_object(request):
csrf_exempt装饰者在这里什么也没做。所以,我也在我的 urls.py 上试过了。 :
url(r'^create_object/', csrf_exempt(views.create_object),),

我什至尝试编写自定义装饰器,并使用 this suggestion .即使我这样做,我似乎也无法在失败之前让装饰器执行。也许我的中间件的顺序有问题?
'sslify.middleware.SSLifyMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',

'corsheaders.middleware.CorsMiddleware',

'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',

'corsheaders.middleware.CorsPostCsrfMiddleware',

'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.RemoteUserMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',

这是我的 Django cors 设置:
CORS_ORIGIN_ALLOW_ALL = False 
CORS_ORIGIN_WHITELIST = ('example.com',)
CORS_REPLACE_HTTPS_REFERER = True

最佳答案

正如所 promise 的,这是我想出的解决方案。诚然,这并不完美。我无法弄清楚潜在的问题(为什么在 HTTPS 上应用程序没有响应 csrf_exemptCORS_REPLACE_HTTPS_REFERER ),但想出了这个有限的解决方案。

第 1 步

首先,我子类化了整个 CsrfViewMiddleware类到我自己的版本中,并将其放入我的中间件中(标记为原始问题的更改):

'sslify.middleware.SSLifyMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',

'corsheaders.middleware.CorsMiddleware',

'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware', ##CHANGE
'myapp.csrf.CsrfViewMiddleware', ##CHANGE

'corsheaders.middleware.CorsPostCsrfMiddleware',

'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.RemoteUserMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',

大约在 的第 160 行我的版本 CsrfViewMiddleware ,我将现有的条件替换为:
            acceptable_referers = ['https://%s' % u for u in settings.CORS_ORIGIN_WHITELIST] + ['http://%s' % u for u in settings.CORS_ORIGIN_WHITELIST]
if not same_origin(referer, good_referer) and referer not in acceptable_referers:

这让我解决了无效引用的问题,这很好,因为我将正常的域列入白名单。它基本上与 CORS_REPLACE_HTTPS_REFERER 的结果相同.我的版本使用 settings.CORS_ORIGIN_WHITELIST 交叉引用引用 header , 而 CORS_REPLACE_HTTPS_REFERER方法暂时改变了 request推荐人。在我看来,两者都不是足够的安全解决方案——但那是另一个话题。

第 2 步

此时,我仍然收到 csrf cookie not found 错误。为了规避这个问题,自 csrf_exempt没有重播(中间件似乎执行得太早了),我添加了一个新的中间件:
'sslify.middleware.SSLifyMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',

'myapp.csrf.CsrfSkipMiddleware' ##ADDED

'corsheaders.middleware.CorsMiddleware',

'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware', ##REMOVED
'myapp.csrf.CsrfViewMiddleware', ##ADDED

'corsheaders.middleware.CorsPostCsrfMiddleware',

'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.RemoteUserMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',

这个新的中间件本质上在请求对象 ( _dont_enforce_csrf_checks ) 上设置了一个标志,该标志已经存在于 CsrfViewMiddleware 的股票版本中。并告诉脚本忽略其余的 csrf 检查。为此,它会根据我选择从 settings.CSRF_SKIP_URLS 中的 csrf 中删除的路径列表来检查页面路径。 .
class CsrfSkipMiddleware(object):

def process_request(self, request):
CSRF_SKIP_URLS = [re.compile(expr) for expr in settings.CSRF_SKIP_URLS]
path = request.path_info.lstrip('/')

if any(m.match(path) for m in CSRF_SKIP_URLS):
setattr(request, '_dont_enforce_csrf_checks', True)

思想

同样,不是最好的实现。但是,就我的目的而言,它有效。想法仍然受欢迎。

关于带有 CSRF/CORS 的带有 TokenAuthentication 问题的 Django REST 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34789301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com