使用授权标头下载锚链接

42

我有一个链接,想要在我的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应用程序。

2个回答

32

在链接点击时设置cookie下载文件的用途是什么? - Ashok Gurram
@AshokGurram 我不知道当时我在想什么或者我想表达什么。可能是我建议重构服务器代码,使用cookie代替用户名和API密钥的组合,这样未来的请求就不会有那个cookie了,但我不确定。也许是翻译上出了问题。无论如何,正如Robert所提到的,有更好的解决方案。 - Artjom B.
感谢您的回复。 我在浏览器中有5个cookie,但是在调用API时,只有3个cookie被发送到后端,其余2个cookie丢失了。 有什么想法吗? 我已经检查了头部,它正在发送5个cookie,但在后端Java中只存在3个cookie。 - Ashok Gurram
我将从新的API操作生成一个临时下载JWT令牌(5分钟生命周期),然后添加一个URL参数以在下载资源中提供它。 - j0nd0n7
1
根据这个回答,现在可以使用XHR来完成 https://dev59.com/22Eh5IYBdhLWcg3wKgug#44435573 如果在发送请求之前将XMLHttpRequest.responseType属性设置为'blob',那么当您收到响应时,它将被表示为一个blob。然后,您可以将blob保存到临时文件并导航到它。 - Jamie Pate
显示剩余4条评论

-8

不要将令牌作为头部传递,而是将其作为URL参数传递

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

3
这似乎不是很安全,对吧?虽然HTTP头部已被HTTPS加密,但如果我没记错的话URL没有加密,因此中间人很容易获取访问令牌。 - ssougnez
3
不要这样做。请求URL不应该包含身份验证信息。URL是定位符,应该定义资源所在的位置,而不是用户可以访问什么。如果出于某种原因必须将令牌作为URL字符串的一部分,请改用查询参数。请注意,路径和查询字符串都在HTTPS下进行加密,但它们更有可能被后端/API记录或由浏览器保存在历史记录或类似位置中,因此通常比使用标头或请求正文来得不太安全。 - haraldfw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接