【问题标题】:Universal way to authenticate clients and secure a RESTful api验证客户端和保护 RESTful api 的通用方法
【发布时间】:2014-12-26 19:21:06
【问题描述】:

我一直在研究 stackoverflow / security.stackexchange 线程,但没有得到明确的答案,无法为客户提供一种通用方式来安全地使用我正在通过 asp.net 的 web api 构建的 RESTful 服务。在寻找这个答案时,我看到“授权”和“身份验证”可以互换使用,所以我想指出我只是想验证请求的身份和合法性。所以,在这一点上,我没有对用户进行身份验证。

亚马逊的模型似乎是“自己动手”时引用的模型,但是,在这种情况下,我确实理解亚马逊已经提供了“论文”,所以这里没有太多的改造。这个帖子, Designing a Secure REST (Web) API without OAuth,非常有帮助。

我收集的是:

  1. 应用程序必须要求 SSL 请求,因此“http://myapi.com/users/1”处的 GET 应被拒绝,并以错误的请求响应让开发人员知道需要 https。
  2. 客户端必须提供应用密钥/秘密来验证他们的身份。
  3. SSL + 证书是个好主意
  4. 需要一个 nonce 值
  5. 当客户注册他们的应用程序时,需要输入他们将发送请求的 URL 和 IP,以便在收到请求时进行验证。我对此的担忧是外部应用程序的可移植性,即应用程序被移动到具有不同 IP 的新服务器,现在它不起作用。

我对 2 几乎没有什么问题,也许我的思绪无法绕开。首先,应用程序的秘密不应该是秘密的吗?那么,如果 javascript 客户端发出请求,这是否会破坏应用程序密钥的保密性?当我可以通过验证应用密钥、nonce 值和服务器 ip 的组合来验证请求身份时,为什么还要有应用秘密呢?我确实理解诸如 php、ruby 或 c#.net 之类的服务器端语言不会暴露这个秘密,但我希望这对于 JS 和编译语言等都是普遍安全的。

最后,Facebook 有一个 developer security checklist 告诉开发人员“永远不要在客户端或可反编译的代码中包含您的 App Secret”,这会向我建议加密的 web.config 或类似的东西。此解决方案不适用于将 REST 服务公开给通过 javascript 使用的任何人。

我梳理过的其他线程:
http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
https://developers.facebook.com/docs/facebook-login/security/
Best Practices for securing a REST API / web service
Security of REST authentication schemes
HTTP Basic Authentication instead of TLS client certification
RESTful Authentication

【问题讨论】:

  • 试试看stackoverflow.com/questions/23718130/… 我认为最好的解决方案是使用基础设施。 (VPN 或相关)
  • 您的场景 #2 是公开服务的好线索,但它没有解决我的概念安全设计问题,即如果支持 javascript 客户端,我是否需要应用程序密码?
  • 你必须创建你自己的模型AK-NAK安全交易(关于它有很多想法)。请记住,该场景中的所有内容都是公开的,javascript 是 100% 公开的。

标签: api security rest authentication ssl


【解决方案1】:

我保护我的应用程序的方式是使用 OpenID Connect。对于您的示例,您在 #2 中谈论的客户端将是 RP(资源提供者),而像 Google 这样的身份验证系统将是您的 OP(OpenID 提供者)

客户端必须提供应用密钥/秘密来验证他们是谁。

实际上将是您的应用程序,您的客户端密码不会离开您的服务器,就像您的 /etc/passwd 文件一样。这个秘密是 RP 用来与 OP 对话以获取数据的秘密。

简而言之,流程是

  1. 用户连接到您的 API 端点,例如/restapi
  2. 您的端点将用户重定向到您注册应用程序的 Google
  3. 用户登录 OP(例如 Google)并获取要传递给 RP 的代码
  4. RP 将去 OP 获取 openid 信息,例如电子邮件
  5. RP 然后将使用该 openid 信息来查找自己的授权表
  6. 一旦 RP 验证用户的授权,RP 将提供其余信息。

【讨论】:

    猜你喜欢
    • 2019-12-02
    • 2020-10-24
    • 1970-01-01
    • 2023-03-10
    • 2017-03-30
    • 2017-01-29
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多