【发布时间】:2016-02-19 00:24:54
【问题描述】:
我已经在 Google App Engine 上在线使用网络应用程序几个月了,没有任何问题。这一切都在周二发生了变化,所有文件上传都开始因 CSRF 问题而失败。
本质上,我调用 prepare_upload 从 Google Cloud Storage 获取一次性 URL,用户将他们的文件发布到该 URL,然后 GCS 在我的代码中调用一个 URL 来完成该过程,所以我有一个处理上传的文件。
移动应用程序使用 Django Rest Framework 的令牌身份验证机制进行身份验证,方法是在每个请求的 Authorization 标头中发送一个身份验证令牌。从几天前开始,此标头似乎已被删除,但我不确定这是否是实际问题。 CSRF 检查失败的事实向我表明,令牌身份验证步骤被跳过,而是使用会话身份验证。
我很困惑。有谁确切地知道此标头是否被 Google Cloud Storage 剥离,如果是,我该如何覆盖或解决它?
这是我的prepare_upload 实用函数:
from google.appengine.ext.blobstore import create_upload_url
def prepare_upload(request, url, **kwargs):
return create_upload_url(
url,
gs_bucket_name = settings.GOOGLE_CLOUD_STORAGE_BUCKET
), {}
【问题讨论】:
-
Cloud Store是指Google Cloud Storage? -
另外你能告诉我
prepare_upload函数的来源吗?我很好奇它是否使用签名 URL。 -
是的,GCS。将我的 prepare_upload 函数添加到问题中。
-
谢谢,还有几个问题:哪个 URL 给了您 CSRF 错误?是在您上传文件时(
/_ah/uploadURL)还是重定向回您的应用程序?可以通过网络上传吗? -
当然!这是重定向回我的应用程序。上传到 GCS 成功,但我的端点没有收到 Authentication 标头(这导致应用程序回退到 Web 会话身份验证)并且没有 Web 会话(来自移动应用程序直接访问 REST 框架而没有 Web 会话),因此 CSRF 检查失败。
标签: django google-app-engine django-rest-framework