【发布时间】:2015-06-09 17:09:26
【问题描述】:
我正在 Angular 中编写一个 webapp,其中身份验证由 JWT 令牌处理,这意味着每个请求都有一个包含所有必要信息的“身份验证”标头。
这非常适合 REST 调用,但我不明白我应该如何处理托管在后端的文件的下载链接(这些文件位于托管 Web 服务的同一台服务器上)。
我不能使用常规的<a href='...'/> 链接,因为它们不会携带任何标头并且身份验证将失败。 window.open(...) 的各种咒语也是如此。
我想到的一些解决方案:
- 在服务器上生成一个临时的不安全下载链接
- 将认证信息作为url参数传递,手动处理案例
- 通过XHR获取数据并保存文件客户端。
以上所有都不尽如人意。
1 是我现在使用的解决方案。我不喜欢它有两个原因:首先它在安全方面并不理想,其次它可以工作,但它需要做很多工作,尤其是在服务器上:下载一些我需要调用一个服务来生成一个新的“随机" url,将其存储在某个地方(可能在数据库上)一段时间,然后将其返回给客户端。客户端获取 url,并使用 window.open 或类似的。当请求时,新的 url 应该检查它是否仍然有效,然后返回数据。
2 似乎至少有同样多的工作量。
3 似乎工作量很大,即使使用可用的库,也有很多潜在的问题。 (我需要提供自己的下载状态栏,将整个文件加载到内存中,然后要求用户将文件保存在本地)。
不过,这项任务似乎很基本,所以我想知道是否有任何更简单的东西可以使用。
我不一定要寻找“Angular 方式”的解决方案。常规的 Javascript 就可以了。
【问题讨论】:
-
远程是指可下载文件与 Angular 应用程序位于不同的域中吗?您是否控制遥控器(有权修改其后端)?
-
我的意思是文件数据不在客户端(浏览器)上;该文件托管在同一个域上,我可以控制后端。我将更新问题以减少歧义。
-
选项2的难度取决于您的后端。如果您可以告诉后端在通过身份验证层时检查查询字符串以及 JWT 的授权标头,那么您就完成了。您使用的是哪个后端?
标签: javascript angularjs jwt