使用 OAuth2 下载 Javascript 中的文件

Download files in Javascript with OAuth2

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

为了授权,脚本会在每个 AJAX 请求中发送一个 "Authorization: Bearer ..." headers。这在请求少量数据时效果很好。 要下载 XML 文件(导出用户数据),我通过 AJAX 下载它们,使用 OAuth2 headers 并创建一个 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();

这种方法有效,但是

那么,问题来了:有没有更好的OAuth2授权下载文件的方法? Javascript 不允许在重定向时指定 headers,OAuth 不允许通过 URL 参数指定授权令牌。我正在考虑

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

如果我是你,我会选择饼干 - 它消除了所有的麻烦。我最近写了一些博客来展示它是多么容易(例如 https://spring.io/blog/2015/01/20/the-resource-server-angular-js-and-spring-security-part-iii)。人们过于关注 "stateless" 应用程序。

原来在 spring-security-oauth2 2.0 中很容易做到。7.RELEASE:

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

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

现在,这将与访问令牌一起以明文形式出现在下载历史记录中,因此为了适当的安全性,应该正确实施 "logout" 选项,否则下载必须作为 "form post".