【问题标题】:How to do authentication within a HTTP service?如何在 HTTP 服务中进行身份验证?
【发布时间】:2010-10-20 19:07:44
【问题描述】:

我们目前有一个具有用户帐户功能的网站,但我们正在寻求提供一个 API,以允许用户通过其他设备/网站管理他们的帐户/执行操作,方法是为常见任务提供 API。

为了安全起见,目前网站登录是通过 HTTPS 完成的,然后使用具有适当安全措施的 PHP 会话进行管理,以防止会话劫持等。

我们如何在 API 中提供此功能?

如何在不进行 POST 的情况下提交登录信息? (推测 GET 是通过 API 调用执行此操作的唯一方法)。发出类似https://www.example.com/login/user-foo@password=bar 的 URL 是否安全?是否在通过网络发送 URL 之前进行 https 设置?

如果我能解决这个问题,那么我会让登录返回一个访问令牌。第一个请求应该包含这个令牌,响应应该返回一个 new 令牌,用于第二个请求等等......

这行得通吗?

【问题讨论】:

    标签: php http api https


    【解决方案1】:

    您可以使用basic www-authentication。它基本上是一个标题,其中包含用户名+密码。这样做的好处是它是无状态的(您不需要单独的登录过程),并且得到很好的支持。实现起来也很简单。只要你通过 https 服务,安全性就很好。

    是否发出类似以下网址:https://www.example.com/login/user-foo@password=bar 安全?

    将凭据放在 URL 中并不好,因为它可能最终会出现在日志中。

    https 设置是否发生在通过网络发送 URL 之前?

    是的,https是在http协议之前建立的。恶意人员唯一能看到的是端点的 IP 地址。

    【讨论】:

    • ...但这意味着 Vinsage 在“通过其他设备/网站执行操作”中的“其他网站”需要知道凭据。
    • @Arjan:如果您询问端点是否都需要知道密码,那么是的。如果这是一个问题,您可以改为使用证书进行 ssl 连接。然后您不需要任何显式身份验证,因为 https 将提供加密和身份验证。设置起来有点重 - 为服务器和客户端。
    • 鉴于您对我的回答的评论,我想您理解,但请确定:通过 OAuth,用户授权(否则不受信任的)第三方代表他/她使用某些服务。第三方不会知道用户凭证,用户可以选择授权一次,也可以随时撤销授权。事实上,这一切都归结为 Visage 是否真的想授予第三方对 API 的访问权限。
    【解决方案2】:

    使用标准,例如OAuth?如果您允许这样做,那么您的用户可以根据需要保留经过身份验证的令牌。

    或者,如果您可以在某些 GET 请求进入时重定向到登录名,您可能根本不需要任何身份验证。例如:任何网站都可以链接到指向 Twitter 的add a tweet 的 URL。未登录时,Twitter 将首先重定向到登录页面。推荐网站甚至不需要知道 Twitter 用户名。

    (是的:在发送 URL 之前,基于服务器的 IP 地址建立了 HTTPS。)

    【讨论】:

    • OAuth 用于授权 - 不是身份验证。它也可能适用于本案,但我认为这不是 Visage 的要求。
    • 好吧,要获得令牌,首先需要进行身份验证。并且为了允许其他网站访问 API(就像 Visage 要求的那样)而不泄露身份验证凭据,我觉得 OAuth 是要走的路。
    • 再次阅读问题,我认为您可能是对的。
    【解决方案3】:

    您可以通过要求调用者设置标头来在 REST API 中执行身份验证。即他们设置了一个“X-YourApp-API-Key”标头,然后您可以读取并使用该标头进行身份验证。这使您不仅可以验证 POST 和 GET 方法,还可以验证 PUT、HEAD 和 DELETE,因此您拥有完整的 REST 方法。

    如果您的所有调用都通过 HTTPS,这本身就很好。如果您想通过 HTTPS 进行身份验证,然后通过常规 HTTP 进行后续调用,您需要实现类似 OAuth 的功能,并为 in-the-clear 请求发出令牌。

    【讨论】:

    • 我不同意。当允许第 3 方代表用户使用 API 时,OAuth 或类似的东西只是一个要求,否则第 3 方需要知道完整的用户凭据(无论是否使用 HTTPS)。
    • “X-YourApp-API-Key”被标准化为“授权”(也称为 www-authentication)。使用它来确保互操作性。
    • 对,如果第 3 方代表另一个最终用户使用 API,您需要 OAuth 来保护用户凭据。如果第 3 方只是自己直接使用 API,那么可能不会。这完全取决于您的 API 的用途。
    【解决方案4】:

    您是否考虑过通过 SSL 使用 SOAP?理论上,您应该能够通过 SOAP 对用户进行身份验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2011-08-14
      • 2012-05-08
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      相关资源
      最近更新 更多