【问题标题】:How to implement protected file download with requests and authentication in django如何在 django 中通过请求和身份验证实现受保护的文件下载
【发布时间】:2019-10-18 11:41:08
【问题描述】:

我有一个可以上传文件的 django 应用程序。我在 API 中显示我的文件。像这样:

class FileCollection(models.Model):
    name = models.CharField(max_length=120, null=True, blank=True)
    store_file = models.FileField(upload_to=upload_file, null=True, blank=True)
    creation_date = models.DateTimeField(null=True, blank=True)

class FileDownloadAPIListView(ListAPIView):
    """Lists all files.

    """
    queryset = FileCollection.objects.all()
    serializer_class = FileCollectionSerializer

稍后我将实现不同的查询来获取特定的文件。

我想使用 python 从脚本中下载这些文件,而无需打开浏览器或类似的东西。我想使用获取我的文件然后将其保存到本地计算机的请求进行经过身份验证的 API 调用。

问题是我的文件必须是私有的,并且只有经过身份验证的用户才能下载它。对于我的其他 API,我正在使用 JWT 令牌身份验证。

我现在的问题是:我该如何实现?我要吗

a) 将我的文件保存在 S3 中并对该 URL 进行 API 调用,以某种方式使用我的 AWS 凭证对我进行身份验证? b) 将我的文件保存在我的 PostgrSQL 数据库中的某个位置,并使用 JWT 通过经过身份验证的 API 调用从那里获取所有内容。 c) 我没有考虑的第三个选项

另外,如果我使用 a、b 或 c,我该如何去实现它们?

选项a)我认为可能是这样的:


def get_file(method='get'):

    headers = {
        "Authorization": "JWT " + token
    }

    url = 'http://localhost:8000/linktomyawsstorage'
    myfile = requests.get(url)
    open('/somefolder', 'wb').write(myfile.content)

    r = requests.request(method, ENDPOINT, headers=headers)

但我不知道如果我的文件位于 AWS 上的私有存储中,这是否仍然有效。另外我不知道这是否应该实现它。

非常感谢任何建议、想法、帮助或提示!

提前非常感谢!

【问题讨论】:

    标签: python django authentication amazon-s3 static


    【解决方案1】:

    您可以使用 S3 预签名 URL。让您的用户通过 UI 对您的应用程序进行身份验证。一旦通过身份验证,您可以为他们生成 S3 预签名 URL,他们可以使用这些 URL 通过浏览器或通过 curl/wget 使用命令行下载文件。

    看看AWS Python SDK documentation on S3 presigned URLs

    您也可以只使用 Python SDK 向 S3 发出请求以获取感兴趣的对象。

    【讨论】:

    • 感谢阿萨曼。这听起来很有希望。这似乎不是最佳解决方案,因为我需要一直创建 URL。没有办法使用 django 请求对 S3 存储桶执行经过身份验证的请求吗?这样会更直接......
    • 也许也很高兴知道:我只需要用户创建拥有我的 AWS 凭证的对象。因此,如果我可以使用下载文件的 AWS 凭证进行 API 调用就足够了.....
    • 嗯好吧,那你为什么不这样做呢?我不确定我遗漏了什么,但是在验证用户请求后,为什么不能使用带有访问密钥对的 AWS python 开发工具包从 S3 下载文件?
    • 因为我不知道这是否是最好的方法,以及我想做的事情是否真的可以按照我的想象......也因为我真的不知道如何使用 AWS python SDK 来做到这一点 :)
    • 好吧,这很简单:boto3.amazonaws.com/v1/documentation/api/latest/guide/…。根据我对您的要求的理解,这对我来说似乎是最简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多