【问题标题】:Download anchor link with authorization header下载带有授权标头的锚链接
【发布时间】:2014-06-22 13:04:39
【问题描述】:

我有一个链接,我想添加到我的 javascript (Marionette/Backbone) 单页应用程序中,该应用程序将通过浏览器的文件保存将 Excel 文件下载到用户的本地驱动器。一个典型的 HTTP 请求是:

GET /api/v1/objects/?format=xls HTTP/1.1
Authorization: ApiKey username:apikey
Host: api.example.com
Connection: close
User-Agent: Paw 2.0.5 (Macintosh; Mac OS X 10.9.2; en_US)
Content-Length: 0

这会导致以下典型响应:

HTTP/1.1 200 OK
Server: gunicorn/18.0
Date: Tue, 06 May 2014 03:09:02 GMT
Connection: close
Transfer-Encoding: chunked
Vary: Accept
Content-Type: application/vnd.ms-excel
Content-Disposition: attachment; filename="filename.xls"
Cache-Control: no-cache

<<CONTENT HERE>>>

我想用一个按钮样式的简单锚元素来实现这一点,因为这会调用浏览器的文件存储机制。类似于:

<a href="/api/v1/objects/?format=xls" class="btn btn-primary pull-right">Download to Excel file</a>

我不清楚在通过锚链接执行此操作时如何获取授权标头 - 或者我只是没有考虑并且有更好的方法。

我的后端是一个使用 Tastypie 的 Django Web 应用程序。

【问题讨论】:

    标签: javascript html http backbone.js tastypie


    【解决方案1】:

    不可能,因为the only way to add HTTP headers is using the XHR,而是XHR cannot be used to download files

    但是,您可以使用 cookie 来执行此操作。

    1. 只需设置 cookie,并从服务器返回值。
    2. 等到用户点击链接。
    3. 在用户单击链接后使 cookie 失效。

    【讨论】:

    • 我怀疑是这种情况。只是想确定一下。我想我会求助于类似于您所建议的某种会话 cookie 安排。谢谢!
    • 点击链接时设置cookie下载文件有什么用。
    • @AshokGurram 不知道我在想什么或我的意思。可能是我建议重构服务器代码以使用 cookie 而不是无效的用户名和 API 密钥组合,以便将来的请求不会有该 cookie,但我不确定。也许翻译中丢失了一些东西。无论如何,正如罗伯特所说,有一个更好的解决方案。
    • 感谢您的回复。我在浏览器中有 5 个 cookie,但是在点击 api 时,只有 3 个 cookie 被发送到后端,剩下的 2 个 cookie 丢失了。任何想法?我已经签入了标头,它正在发送 5 个 cookie,但在签入后端 java 时只有 3 个 cookie 存在。
    • @AshokGurram 如果您在浏览器中检查了开发人员工具,确认 cookie 是在您期望的请求中发送的,那么这确实是服务器问题。 Java 服务器生态系统非常广泛,您必须更具体,但即便如此,我也不确定我能否回答。确保您从服务器端的正确请求中检查 cookie。
    【解决方案2】:

    而不是在标头中传递令牌,而是将其作为 url 参数传递

    <a href="/api/download/answers/{{token}}/{{survey._id}}" download="answers.csv" >
    </a>
    

    【讨论】:

    • 这似乎不太安全,是吗?标头是通过 HTTPS 加密的,但如果我没记错的话,URL 不是,所以中间的人很容易获得访问令牌。
    • 不要这样做。请求 URL 不是授权信息的地方。 URL 是定位器,它们应该定义资源的位置,而不是用户可以访问它们的位置。如果您出于某种原因必须将令牌作为 URL 字符串的一部分,请改用查询参数。仅供参考,路径和查询字符串都在 HTTPS 下加密,但它们更有可能被后端/API 记录或被浏览器保存在历史记录或类似内容中,因此它通常不如使用标头或请求正文安全.
    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 2021-03-04
    • 2021-06-06
    • 2018-03-20
    • 2014-12-25
    • 2012-03-22
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多