保护HTTP API - 没有用户密码提示并避免公开私钥

时间:2012-03-06 21:57:14

标签: javascript security oauth ssl federated-identity

我正在研究通过HTTP公开的API,这些API将由合作伙伴公司使用并部署到其众多客户端。

在某些情况下,客户端将基于浏览器。这是我的主要关注点,但我可能会在客户端是Windows应用程序的情况下应用相同的模式。我认为,当Windows应用程序与基于浏览器的应用程序相比时,在客户端上保护私钥的范围更大。因此,正在进行的通信是从合作伙伴应用程序呈现的浏览器页面到我们托管API的服务器。

底线是我们无法提示最终用户提供凭据,并且必须依赖将随每个请求传递的存储密码/密钥/令牌。我担心的是,我想阻止合作伙伴公司将此令牌烘焙到客户端代码中。以下是该场景的高级描述。

  1. 合作伙伴与我们建立了一个帐户(手动流程),执行必要的开发工作以在其产品中使用API​​,然后将其推广给客户。
  2. 客户端然后运行产品并通过向导建立他们的帐户。我们此时可以提示他们输入用户名和密码,但是以后对API的所有请求都不应该提示实际最终用户提供凭据。
  3. 然后,他们执行无数的业务流程,在许多不同的用户上下文中的许多工作站上调用我们的API。我们不关心个人用户信息。
  4. 出于这个问题的目的,我将跳过第1步,重点关注第2步和第3步。

    我目前正致力于保护此API并提出以下设计:

    • 无处不在的HTTPS(所有请求都使用SSL / TLS)
    • 所有POST请求都使用CSRF令牌
    • 在客户创建帐户的第2步中,我们为其提供客户端验证码。合作伙伴应编写应用程序以将此身份验证代码存储在服务器上。
    • 在将来调用我们的API之前,他们会在我们的javascript库上调用Init函数并提供回调,例如“GetAuthToken”。
    • 每次调用我们的API时,我们会检查是否有Auth Token(在服务器上),如果不是,我们会返回错误并调用回调。
    • 实施回调时的合作伙伴应使用HTTPS调用其服务器来检索令牌。此请求将受其正常身份验证的约束,因此假设如果用户在其系统中进行身份验证,则他们可以检索身份验证令牌。
    • 我们收到验证令牌,拨打我们的服务器验证它,然后设置一个包含令牌的HTTPOnly cookie。
    • 当Cookie过期时,我们再次调用GetAuthToken回调。
    • 使用postMessage管理跨域问题
    • 我们可以使Auth Token可撤销

    我们在这里有一种联邦安全形式,如果用户通过合作伙伴进行身份验证,那么我们假设他们可以访问我们的API。我可以想到的唯一方法是避免将私钥/身份验证令牌烘焙到客户端代码中,这就是这种回调机制。

    我过度复杂了吗?还有其他更简单的方法吗?我知道如果任一站点对XSS开放或被恶意软件攻击,所有投注都会关闭,但至少不将私钥呈现为javascript或标记,用户无法右键单击查看源并告诉每个人私钥。

    编辑:发现了这个问题。最上面的答案描述了类似于我所描述的内容,虽然提到了WIF,我不想强​​迫合作伙伴实施(他们甚至可能不运行Windows)。仍然希望对我的方法提出反馈......

    Web Application - User Authentication Across Domains

1 个答案:

答案 0 :(得分:0)

我知道您要求进行简化,但是您是否已经开始探索SAML联盟,其中每个合作伙伴在启动应用程序时都会向您声明其身份,并且您使用身份验证令牌对其进行了限制?它避免了JS的全部涉及,并与SSL + CSRF令牌一起使用,使您处于一个好位置。

相关问题