使用 oAuth 对 javascript 小部件进行身份验证

Posted

技术标签:

【中文标题】使用 oAuth 对 javascript 小部件进行身份验证【英文标题】:Authenticating javascript widget using oAuth 【发布时间】:2012-11-26 15:48:32 【问题描述】:

我正在构建一项营销服务,我们在其中为各种公司提供小部件以将其托管在他们的网站上。这些小部件应该使用 javascript 直接从浏览器与我的服务器中的其余 API 对话,以获取和发布信息。最终用户可能需要也可能不需要授权,具体取决于他们访问的数据类型。我们需要使用流行的社交网络(如 facebook、twitter 等)对最终用户进行身份验证。实际上,我们的服务器端 api 需要验证两件事 1. 呼叫来自各自公司的网站 2. 呼叫由适当的端进行用户。

我不确定我必须在这里使用哪种身份验证。我认为,我不能使用 oauth(1.0, 2.0),因为它需要不能安全地存储在 javascript 中的消费者密钥和秘密。是否有任何可以使用的修改后的 oauth 流程?已经有人解决了这个问题。如果我有人在服务器端有基于弹簧的解决方案,那就更好了。

【问题讨论】:

我们做了同样的事情,与用户的实际身份验证方法无关;见REST authentication and exposing the API key。如果用户未通过身份验证,则该解决方案不是 100% 安全的,在这种情况下,所有请求都可能被服务器端脚本伪造。但是无论如何,公共数据都可以从各自公司的网站上抓取。 (当然,为爬虫提供 API 让他们的生活更轻松......) “最终用户可能需要也可能不需要授权” -- 授权还是认证? 【参考方案1】:

您无法验证电话是否来自相应公司的网站。呼叫将来自最终用户的浏览器,而不是网站。

此外,浏览器不能直接调用您的站点(至少不使用XMLHTTPRequest,因为您的小部件和服务器不在同一个域中。您可以使用 JSONP 解决此问题。

您可以使用 OAuth2,以及此处规范中所述的隐式授权流程:https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-31#section-4.2

【讨论】:

可以通过使用if(document.domain == 'expected-domain.com) 的 JavaScript 文件设置令牌来确保域是正确的,if 可以确保它确实是获取 JavaScript 的浏览器,并且如果无法使用 XHR/Ajax 获取 JavaScript(因此不支持 CORS 或 JSONP,对于 JavaScript)。但是,确保它是浏览器可能需要访问者从 API 的服务器获取一些 cookie,例如 always 需要用户身份验证,这在 OP 的情况下是不可行的。您知道 OAuth2 的隐式授权是否适用于匿名访问者? 啊,再次阅读问题,也许用户总是经过身份验证,但并不总是被授权使用某些特定的网站。似乎 OAuth Implicit Grant 的工作方式相反:网站需要由用户授权。或者可能是关于某些操作的授权,而不是某些站点。如果用户可以使用任何已知网站,那么博客文章OAuth and Client-Side Widgets 可能有助于确保使用已知网站。

以上是关于使用 oAuth 对 javascript 小部件进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

保护 API 以与 Javascript 小部件一起使用

如何控制谁使用我的网络小部件

使用 SoundCloud 默认音频小部件,您可以将其设置为从 JavaScript 随机播放吗?

私人JavaScript小部件

添加不同颜色的 Gridster 小部件

在javascript中删除一个小部件