使用OAuth2在Javascript中下载文件

Dmi*_*hin 5 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();
Run Code Online (Sandbox Code Playgroud)

这种方法有效

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

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

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

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

Dmi*_*hin -1

事实证明,在 spring-security-oauth2 2.0.7.RELEASE 中这非常容易:

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

window.open("service/export?access_token=" + access_token);
Run Code Online (Sandbox Code Playgroud)

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

  • URL 将与令牌一起保存在浏览器的历史记录中。任何有权访问浏览器历史记录的人都可以找到该 URL 并提取 access_token 值。因此,如果用户从公共计算机登录,他需要能够注销(销毁/忘记服务器端的access_token),否则任何人都可以使用他的access_token,直到它过期。Spring不提供“注销”功能,因此除非令牌是短暂的,否则需要实现一个功能来删除服务器端的access_token。 (8认同)
  • Dmitry Zolotukhin 是对的,不要将访问令牌作为请求参数传递。以下是 OAuth 文档中的链接:https://tools.ietf.org/html/rfc6750#section-5.3 不要在页面 URL 中传递承载令牌:承载令牌不应在页面 URL 中传递(例如,作为查询)字符串参数)。相反,不记名令牌应该在采取保密措施的 HTTP 消息头或消息体中传递。浏览器、Web 服务器和其他软件可能无法充分保护浏览器历史记录、Web 服务器日志中的 URL... (2认同)