使用 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();
这种方法有效,但是
- 使用 RAM,因此不适合大文件下载
- 没有显示正确的 progress/loading 栏
那么,问题来了:有没有更好的OAuth2授权下载文件的方法? Javascript 不允许在重定向时指定 headers,OAuth 不允许通过 URL 参数指定授权令牌。我正在考虑
- 添加特殊的 Spring MVC 控制器方法以提供 URL 从 URL-encoded 令牌重定向到 header-encoded HTTP 请求
- 添加额外的 Spring 安全过滤器以允许从 URL 参数中提取令牌
- 转向 cookie-based 授权而不是 OAuth2
如果有人有类似的问题,能否请您分享一下您解决这个问题的方法?
如果我是你,我会选择饼干 - 它消除了所有的麻烦。我最近写了一些博客来展示它是多么容易(例如 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".
我正在开发 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();
这种方法有效,但是
- 使用 RAM,因此不适合大文件下载
- 没有显示正确的 progress/loading 栏
那么,问题来了:有没有更好的OAuth2授权下载文件的方法? Javascript 不允许在重定向时指定 headers,OAuth 不允许通过 URL 参数指定授权令牌。我正在考虑
- 添加特殊的 Spring MVC 控制器方法以提供 URL 从 URL-encoded 令牌重定向到 header-encoded HTTP 请求
- 添加额外的 Spring 安全过滤器以允许从 URL 参数中提取令牌
- 转向 cookie-based 授权而不是 OAuth2
如果有人有类似的问题,能否请您分享一下您解决这个问题的方法?
如果我是你,我会选择饼干 - 它消除了所有的麻烦。我最近写了一些博客来展示它是多么容易(例如 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".