2015-02-07 86 views
5

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

对于授权,脚本会为每个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,以允许提取从URL中的令牌参数
  • 转移到基于cookie的授权的OAuth2

,而不是如果没有人有类似的问题,请你分享你的方法解决这个问题?

回答

3

原来它很容易在春季,安全的oauth2 2.0.7.RELEASE向:

只需通过访问令牌作为access_token请求参数:

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

现在,这就会出现在下载历史记录中以明文形式存取令牌,因此为了确保安全,应该正确实施“注销”选项,否则下载操作必须以“表格帖子”的形式完成。

+0

很高兴知道这个功能。有一个问题,你认为“注销选项应该正确实施”是什么意思? – dacuna 2015-09-06 04:27:35

+5

该URL将与令牌一起保存在浏览器的历史记录中。任何有权访问浏览器历史记录的人都可以找到该URL并提取access_token值。因此,如果用户从公共计算机登录,他需要能够注销(销毁/忘记服务器端的access_token),否则任何人都可以使用他的access_token,直到它过期。Spring不提供“注销”功能,因此除非令牌短暂存在,否则需要实施一项功能来擦除服务器端的access_token。 – 2015-09-06 12:33:46

+0

Aaam好的,谢谢你的评论! – dacuna 2015-09-06 20:05:02

1

如果我是你的话,我会用饼干去 - 它需要所有的麻烦。我最近写了一些博客来展示它是多么容易(例如https://spring.io/blog/2015/01/20/the-resource-server-angular-js-and-spring-security-part-iii)。人们对“无状态”应用程序太过担心。

+1

什么是你的解决方案,以防止xsrf在这种情况下? – Bon 2015-09-17 20:47:03

+0

Spring Security和Spring Security OAuth都默认使用反xsrf(我们称之为“csrf”)度量。如果您有特别的问题,我会提出这个问题作为一个单独的问题。 – 2015-09-24 06:57:43

+0

但是,如果cookie来自外部来源,那么您如何为xsrf预防提供令牌是我很好奇的。 – Bon 2015-09-24 14:11:50