Chrome阻止使用FileResponse下载FastAPI文件,因为使用HTTP而不是HTTPS

ijxebb2r  于 2022-12-06  发布在  Go
关注(0)|答案(2)|浏览(319)

我有一个基本的FastAPI网站,它有一个下载Excel模板的端点。网址的方案是HTTPS。直到最近,这个方案在Chrome和Safari上都运行得很好。随着人们的升级,Chrome一直在阻止下载。这似乎与谷歌针对“混合内容下载”实施的不安全内容政策一致,如本文所述:
https://blog.chromium.org/2020/02/protecting-users-from-insecure.html
我的终结点非常简单:

@router.get('/download_data_template')
def download_data_template(request: Request):
    '''Returns data template from library
    '''
    # ### auth
    # page access is authorized here
    # end auth

    file_name = 'TEMPLATE schedule_input.xlsx'

    return FileResponse(
        path=db.get_library_path(file_name),
        filename=file_name,
        media_type='application/octet-stream',
        )

使用以下代码从Jinja2模板化的html页面调用终结点:

<a class="btn btn-primary" href="{{ url_for('upload_schedule')}}" data-toggle="tooltip" data-delay='{"show":750, "hide":250}' data-placement="top" data-toggle="tooltip" data-delay='{"show":750, "hide":250}' data-placement="top" title="click to select and upload file. The file must be in property format.">upload schedule input workbook</a>

在Chrome上,开发者面板显示以下错误:

"Mixed Content: The site at 'https://<my_url>.com/' was loaded over a secure connection, but the file at 'https://<my_url>.com/download_data_template' was redirected through an insecure connection. This file should be served over HTTPS. This download has been blocked. See https://blog.chromium.org/2020/02/protecting-users-from-insecure.html for more details."

这个文件没有什么独特之处,它是一个基本的Excel .xlsx文件,一个供人们填写的模板。
这在Safari和Edge中继续正常工作,但被Chrome阻止。
chromium博客中的文章信息量很大,但我不知道如何使我的下载安全。我也搜索过,但没有成功。
有什么想法,我可以使一个基本的文件下载,特别是一个.xlsx文件,从光盘使用FastAPI,将符合谷歌的新政策?
谢谢你的帮助。

zdwk9cvp

zdwk9cvp1#

选项1

您可以使用HTTPSRedirectMiddleware强制将所有传入的http请求重定向到安全方案。

from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware
app = FastAPI()
app.add_middleware(HTTPSRedirectMiddleware)

选项2

除了上面提到的,你可以在Jinja 2模板中使用相对URL而不是使用url_for();例如:

<a href="/upload_schedule">Link text</a>

这样,URL的方案将保持https

选项3

您可以使用自己的url_for自定义函数来替换URL的方案,类似于this answer的Option 2中演示的方法。
您可能还想尝试将--proxy-headers参数传递给Uvicorn,如下所述。

lh80um4z

lh80um4z2#

我正在FastAPI后端开发React应用程序,也遇到了类似的问题。我不确定{{ url_for('upload_schedule')}}在渲染引擎中的评估结果,但在我的案例中,问题是不准确的URL及其FastAPI的处理。
参考您的示例,我在UI代码中放置了/download_data_template/,因此FastAPI引擎发送了307,因为它重定向到/download_data_template。在UI代码中将/download_data_template/替换为/download_data_template解决了这个问题。
这可能是Chrome的问题,而不是FastAPI,但这是一个简单的解决办法,立即修复。

相关问题