javascript - OAuth 2.0 是保护 Web 服务访问的合适工具吗?

标签 javascript java ajax web-services oauth

我打算创建两个项目。

一个项目将是一个简单的以 HTML/Javascript 为中心的项目,它使用 AJAX 从网络服务中检索和轮询数据。我们称它为项目 A

另一个项目,项目 B,是一个 RESTFul 网络服务,它只是缓存从外部源检索的数据。

基本上,项目 B 将作为 1 个以上项目的 Web 服务。我不会向公众公开项目 B。我刚刚使用项目 A 作为示例项目,它将从项目 B 进行轮询。

我读过有关 OAuth 2.0 的文章,它似乎是防止任何其他应用程序访问我的 Web 服务的最佳和最直接的方法。但这里有一些问题:

  1. 因为项目 A 和项目 B 将位于两个不同的域中。 AJAX 会在这种情况下工作吗?因为我读过如果我打算从另一个域检索数据,我必须使用 JSONP。 JSONP 的安全性如何?
  2. 假设我实现了 OAuth,我将如何管理用于 token 加密/解密的安全 key ?最初,我的想法是项目 A 是一个简单的 Java 项目,它基本上可以存储 key 并从我的 Web 服务进行轮询。这样,问题 #1 就可以解决,因为我可以简单地使用一个简单的 AJAX 函数。但是,我觉得制作一个 Java web 项目只是为了存储 key 并从 web 服务中轮询信息是完全没有必要的。我担心的是,如果我不把它变成一个 Java 项目,我就不知道在哪里存储我的 key 。当然,我不会在 JS 代码中存储/公开它。

这让我不禁要问,OAuth 2.0 是正确的选择吗?或者还有其他更简单的选择吗?

最佳答案

与这里所说的相反:

我认为 OAuth 2.0 不是正确的选择。

为什么?

OAuth 2.0 是一种授权协议(protocol),而不是身份验证协议(protocol)。 它依靠第三方提供身份验证。 该第三方还存储谁有权访问哪些资源,以防您想要重新授权服务使用。 所以仅靠 OAuth 2.0 永远无法解决任何身份验证问题。 如果您希望您的应用程序(在 oauth 的术语中:资源服务器)独立于提供 OAuth(授权服务器)的其他第三方,您必须自己实现一个授权服务器。 您将拥有有限数量的资源服务器,而 OAuth 实际上是为了授权跨多个提供商的服务访问。 因此,我看不出 OAuth 如何解决您的问题。

JSONP 是否安全实际上是一个有趣的问题。

JSONP 究竟是什么? 它是 javascript 在您的 DOM 中添加脚本标记并使浏览器加载该附加资源。 它是否安全基本上与要求浏览器和服务器之间的任何通信的安全性是相同的问题。 它会像您所做的那样安全。 具有 Access-Control-Allow-Origin 等的 AJAX 也是如此。

那怎么办?

先说一件事。 如果您的应用程序 A 只是静态资源,则您不需要应用程序,您需要内容交付网络。 这就是 stackoverflow 的工作方式,也是它超越您自己托管的任何服务器的方式。 确实如此,还有像 google 的 pagespeed 这样的缓存代理(我不知道该产品是否仍然存在,但这只是一个例子)。

这里还有两个想法:

如果您希望两个应用程序之间的通信安全,您可以使用非对称加密。 交换公钥,您就可以验证身份并安全地传输数据。 我将留给您深入研究此事。

此外,正如 Steve E. 所写但没有正确命名,您可以使用 CSRF token 。 我相信 jQuery 支持这些技术已经有一段时间了,但该技术在没有 jQuery 的情况下也同样有效。 同样,我会让您深入研究这个问题。

最后

所有这些让我想到重新发明轮子。 只要您的连接是安全的,您几乎可以做任何事情(包括使用真正长字符串的纯文本身份验证),只要您有点偏执并在您的身份验证机制中加入一点熵。 再一次,它必须有多安全?这是一个大多数时候用“绝对安全”回答的问题,但实际上很少是真正的要求。

关于javascript - OAuth 2.0 是保护 Web 服务访问的合适工具吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32661722/

相关文章:

javascript - Summernote上传图片: onImageUpload and sendFile function not working

java - JBoss Drools 要求

java - 更改 json 中的数字

jquery - 检查AJAX响应是否为空等问题

javascript - 文件管理器插件 - TinyMCE - 服务器响应不是 JSON 格式

javascript - Android Talkback 未注册 Web 版 onFocus。如何使用 Android Talkback 操作辅助功能焦点?

javascript - 使用 knex.js 从关联表中删除数据

java - 如何使用 Spark 在服务器上运行 java 程序?

javascript - 如何从带有 2 个按钮的表单单击按钮发送 Ajax 请求?

javascript - 内容类型 : false and processData: false make POST empty in PHP