代码之家  ›  专栏  ›  技术社区  ›  Evert

基于浏览器的RESTAPI身份验证

  •  4
  • Evert  · 技术社区  · 15 年前

    我正在研究RESTWebService,尤其是基于浏览器的请求的身份验证方法。(使用JSONP或跨域XHR请求/XdomainRequest)。

    我在Oauth和亚马逊的AWS做过一些研究。两者的最大缺点是,我需要执行以下任一操作:

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

    还有什么其他的选择或建议?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Evert    15 年前

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

        2
  •  0
  •   manuel aldana    15 年前

    是的,JSONP调用身份验证很困难,因为浏览器客户端需要知道共享的秘密。

    一个选项是使端点匿名(不需要身份验证)。这与其他的安全整体(服务器是开放的,任何人都可以称之为攻击)。但您可以通过只公开非常有限的资源和/或使用速率限制来处理这一问题。通过速率限制,一个客户机在一定时间范围内只允许一定数量的调用。它通过识别客户机来工作(例如,通过源IP或其他客户机足迹)。

    我曾经尝试过一次性令牌,但它们都有点失败,因为您有获取令牌本身的问题,以及通过bots保护多次检索令牌的问题(这又需要限制速率)。

        3
  •  0
  •   ps.    15 年前

    我自己也没试过,但你可以试一下……(我相信我会得到一些反馈)

    在服务器端,生成时间戳。使用hmac-sha256,使用密码为该时间戳生成密钥,并将生成的密钥和时间戳发送到HTML中。

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

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