基于浏览器的 REST api 身份验证

Posted

技术标签:

【中文标题】基于浏览器的 REST api 身份验证【英文标题】:Browser-based REST api authentication 【发布时间】:2011-04-28 12:48:15 【问题描述】:

我正在开发 REST Web 服务,特别是基于浏览器请求的身份验证方法。 (使用 JsonP 或跨域 XHR 请求/XDomainRequest)。

我对 OAuth 以及亚马逊的 AWS 做了一些研究。两者的最大缺点是我需要执行以下任一操作:

在浏览器中存储秘密令牌 让服务器端脚本处理签名。基本上我会首先向我的服务器发出请求,以获取特定的预签名 javascript 请求,我将使用该请求连接到真正的 REST 服务器。

还有哪些其他选择或建议?

【问题讨论】:

【参考方案1】:

是的,jsonp 调用认证很困难,因为浏览器客户端需要知道共享密钥。

一种选择是使端点匿名(无需身份验证)。这伴随着其他安全整体(服务器对攻击开放,任何人都可以调用它)。但是您可以通过仅公开非常有限的资源和/或使用速率限制来解决此问题。在速率限制的情况下,一个客户在一定的时间范围内只允许一定数量的呼叫。它通过识别客户端(例如通过源 IP 或其他客户端足迹)来工作。

我曾经尝试过一次性令牌,但它们都有些失败,因为您遇到了获取令牌本身和保护机器人对令牌的多次检索的问题(这又回到了速率限制的需要)。

【讨论】:

对不起...深夜打字/拼写,今天早上会使用漏洞这个词;) 我正在考虑使用限时多请求令牌.. :S 当你完成后,知道你的实现会很酷【参考方案2】:

好吧,这里唯一真正的答案是通过服务器进行代理,使用会话/cookie 进行身份验证,当然还使用 SSL。很抱歉回答我自己的问题。

【讨论】:

【参考方案3】:

我自己没有尝试过,但你可以尝试以下..(我很确定我会得到一些反馈)

在服务器端,生成时间戳。使用 HMAC-SHA256 使用密码生成该时间戳的密钥,并在 html 中发送生成的密钥和时间戳。

当您对 Web 服务(假设它是不同的服务器)进行 AJAX 调用时,将密钥和时间戳连同请求一起发送。检查时间戳是否在 5-15 分钟内。 如果生成的密钥相同,则使用相同的密码和密钥执行 HMAC-SHA256。 同样在客户端,您必须在拨打电话之前检查您的时间戳是否仍然有效..

您可以使用以下网址生成密钥。 http://buchananweb.co.uk/security01.aspx

【讨论】:

以上是关于基于浏览器的 REST api 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

REST API 中基于令牌的身份验证

Rest API 基于令牌的身份验证。基本认证

Intranet API 的 REST 身份验证缓存

REST API 的身份管理和身份验证

登录时 WooCommerce REST API 身份验证失败

Netsuite - REST API - 使用基于令牌的身份验证 (TBA) 进行查询 - (在 Python 中)