使用OAuth2在Javascript中下载文件

时间:2015-02-07 16:25:07

标签: oauth spring-security spring-security-oauth2

我正在开发一个单页,在客户端使用Javascript + AngularJS,在服务器端使用Spring MVC + Spring Security OAuth2。 Spring MVC充当来自页面的任何AJAX请求的REST控制器。

对于授权,脚本会向每个AJAX请求发送“Authorization:Bearer ...”标头。这在请求少量数据时工作正常。 要下载XML文件(导出用户数据),我通过AJAX下载它们,使用OAuth2标头并创建一个Blob以允许在浏览器中保存文件:

var blob = new Blob([data.data], {'type': "text/xml"});
var a = document.createElement("a");
a.href = window.URL.createObjectURL(blob);
a.download = "downloaded-file-" + new Date().toISOString() + ".xml";
a.click();

这种方法有效但

  • 使用RAM,因此不适合大文件下载
  • 未显示正确的进度/加载栏

所以,问题是:是否有更好的方法可以使用OAuth2授权下载文件? Javascript在执行重定向时不允许指定标头,OAuth不允许通过URL参数指定授权令牌。我想的是

  • 添加一个特殊的Spring MVC控制器方法,以提供从URL编码的令牌重定向到头编码的HTTP请求的URL
  • 添加额外的Spring Security过滤器以允许从URL参数中提取令牌
  • 转而使用基于cookie的授权而不是OAuth2

如果有人有类似的问题,你能否分享一下这个问题的方法?

2 个答案:

答案 0 :(得分:3)

原来很容易在spring-security-oauth2 2.0.7.RELEASE:

只需将访问令牌作为access_token请求参数传递:

window.open("service/export?access_token=" + access_token);

现在,这将在下载历史记录中以明文显示访问令牌,因此为了获得适当的安全性,应正确实施“注销”选项,否则下载必须以“表单帖子”完成。

答案 1 :(得分:1)

如果我是你,我会选择使用cookies - 它可以解决所有麻烦。我最近写了一些博客来展示它是多么容易(例如https://spring.io/blog/2015/01/20/the-resource-server-angular-js-and-spring-security-part-iii)。人们对“无国籍”的申请过于沉闷。