使用 OAuth2 下载 Javascript 文件
Posted
技术标签:
【中文标题】使用 OAuth2 下载 Javascript 文件【英文标题】:Download files in Javascript with OAuth2 【发布时间】:2015-04-07 16:46:45 【问题描述】:我正在开发一个单页面,在客户端使用 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如果有人有类似的问题,您能否分享您解决此问题的方法?
【问题讨论】:
【参考方案1】:如果我是你,我会选择 cookie - 它消除了所有的麻烦。我最近写了一些博客来展示它是多么容易(例如https://spring.io/blog/2015/01/20/the-resource-server-angular-js-and-spring-security-part-iii)。人们过于依赖“无状态”应用程序。
【讨论】:
在这种情况下防止 xsrf 的解决方案是什么? Spring Security 和 Spring Security OAuth 都具有默认开启的 anti xsrf(我们称之为“csrf”)措施。如果您有特别的顾虑,我会将其作为一个单独的问题提出。 但是,如果 cookie 来自外部来源,您如何提供用于防止 xsrf 的令牌是我很好奇的。【参考方案2】:原来在 spring-security-oauth2 2.0.7.RELEASE 中很容易实现:
只需将访问令牌作为access_token
请求参数传递:
window.open("service/export?access_token=" + access_token);
现在,这将在下载历史记录中以明文形式显示访问令牌,因此为了适当的安全性,应正确实施“注销”选项,否则下载必须作为“表单发布”完成。
【讨论】:
很高兴知道这个功能。一个问题,“应该正确实施注销选项”是什么意思? URL 将与令牌一起保存在浏览器的历史记录中。任何有权访问浏览器历史记录的人都可以找到 URL 并提取 access_token 值。因此,如果用户从公共计算机登录,他需要能够退出(销毁/忘记服务器端的 access_token),否则任何人都可以使用他的 access_token 直到它过期。 Spring 不提供“注销”功能,因此除非令牌是短暂的,否则需要实现一个功能来擦除服务器端的 access_token。 Dmitry Zolotukhin 是对的,不要将访问令牌作为请求参数传递。这是来自 OAuth 文档的链接:tools.ietf.org/html/rfc6750#section-5.3 不要在页面 URL 中传递不记名令牌:不应该在页面 URL 中传递不记名令牌(例如,作为查询字符串参数)。相反,不记名令牌应该在采取保密措施的 HTTP 消息头或消息体中传递。浏览器、Web 服务器和其他软件可能无法充分保护浏览器历史记录、Web 服务器日志中的 URL…… 请记住,Spring Security OAuth
项目已被弃用。以上是关于使用 OAuth2 下载 Javascript 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Oauth2 和 javascript 客户端(Spring Oauth2 + Angularjs)实现长期登录会话
如何在 Javascript 中实现安全的 OAuth2 消费?
来自客户端 javascript 的错误 400 Cognito /oauth2/token 端点
javascript axios oauth2 example#oauth2