基于浏览器的 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 身份验证的主要内容,如果未能解决你的问题,请参考以下文章