我正在设计一项新服务,使“客户”能够为他们执行的特定搜索注册并支付每次使用费.将使用RESTFul和SOAP接口公开此服务.通常,Web服务将与客户的网站集成,然后暴露给“公共”,任何人都可以使用客户的网站,并利用我的Web服务功能(客户将支付但完全控制调节)请求所以他们不会收取太多费用).
我想设计优化集成的服务,使其尽可能简单. Web服务API将发生变化,因此创建内部代理以在某些情况下向公众公开Web服务对客户来说太过贬低.因此,我认为这个问题是创建一个平衡身份验证,安全性和集成的Web服务.
理想
>不使用OAuth
>避免强迫客户创建内部代理,以重新公开我已经使用的相同Web服务API.
>安全(令牌用户名/通过任何和ssl)
>在客户网站中嵌入一个javascript库 – 这将是一个客户端Javascript库,使集成步骤更容易.
> Javascript库需要足够安全,以便公众无法简单地获取凭据并自行重新使用它
>如果可能的话,不要太苛刻,因此如果Firefox 87出来(将在几分钟内发布)并且决定使用fubar,则不必重新构建Web服务.
似乎需要某种3方式身份验证过程才能使其工作,即对特定客户端(在公共场所),Web服务(客户)和Web服务进行身份验证.
有没有人实现类似的东西,他们是如何解决这种情况的?
我也理解在可以做什么和违反跨域安全性之间存在平衡,因此整个Web服务可能会被另一个仅返回JSONP数据的GET接口暴露.
/ **附录** /
我已经发现了一个可以完成我正在照顾的Web服务.但是,我不完全了解实施细节.所以也许有人也可以详细说明我的想法.
我发现的Web服务似乎在服务端托管了Javascript.然后,客户将他们的网站与服务端集成,将Javascript包含在脚本标记中,但提供了一个密钥来执行此操作,即
不知何故,如果我将脚本添加到我的网站,它不起作用.所以,在某个地方,令牌必须注册到特定的客户域,而’client-lib.js’实际上是一个servlet或类似的东西,它可以某种方式检测到来自’public’的用户实际上来自’客户’域名.
我的想法是对的吗?是否有某种http标头可以这种方式使用?这样安全吗?
干杯
我假设您要向搜索网站的所有者收取费用,而不关心个人用户是谁进行搜索.如果这不正确,请澄清,我会相应地更新我的答案.
显然,在任何这种情况下,您需要做的首要事情是确保您知道每个请求上的客户端.并且 – 正如您所说,您还希望确保自己免受跨站点攻击和人们窃取用户密钥的侵害.
您可能会考虑以下内容:
>在您身边创建一个私钥 – 只有您的服务知道.
>每当新的消费者网站创建一个帐户时,请创建一个只有您和他们知道的新共享密钥.我建议使用您的私钥作为密码来创建此密钥,并加密某种标识符,以便您识别此特定用户.
>作为注册过程的一部分,让消费者站点告诉您他们将使用您的脚本的URI.
现在 – 您进行跟踪和身份验证的方式变得相当简单.
你提到提供一个JS库,每次FF更新时都不需要更新.我建议使用jQuery或其他类似支持的跨浏览器JS基础库构建该库 – 并让它包装你的AJAX.
但是,当客户端站点请求您的脚本时,请让他们为您提供以下内容:
http://www.yourdomain.com/scripts/library.js?key={shared key}
在您这边,当您收到此请求时,请检查以下内容:
>当您使用私钥解密其共享密钥时,您不应该得到胡言乱语.如果你这样做 – 这是因为他们的密钥已经以某种方式被改变 – 并且无效.这应该导致401:未经授权的错误.
>解密密钥并知道这是哪个客户端站点(因为这是密钥包含的内容) – 检查以确保请求来自客户端注册的相同URI.现在,这可以保护您免受窃取密钥并将其注入其他网站的人的侵害.
>只要以上匹配,就让他们下载文件.
现在 – 当你提供JS文件时,你可以通过将密钥注入该文件的方式来实现 – 因此它可以访问它们的共享密钥.在每个AJAX请求中,包含该密钥,以便您可以确定此请求来自哪个客户端.在RESTful环境中,实际上不应该有会话 – 因此您需要在每个帖子上进行此级别的身份验证.我建议把它作为一个cookie包括在内.
在服务器端 – 只需在每个后续请求中重复检查其密钥 – 瞧 – 您自己构建了一些相当严格的安全性而没有大量开销.
也就是说 – 如果你期望大量的流量 – 你可能希望回到这一点并在未来探索更深层次的安全流程,因为滚动你自己的安全矩阵可能会留下意想不到的漏洞.然而 – 这是一个良好的开端,将让你离开地面.
如果您需要,请随时提出任何问题,我会尽力更新我的答案.