如何使用站点 API 对用户进行身份验证


How do I authenticate users with a site API?

我想为用户构建一个API,以构建与站点轻松交互的应用程序,我想知道对用户进行身份验证的最佳方式是什么。

看看其他API,其中很多都让用户通过HTTPS连接将用户名和密码作为GET参数发送。这是最好的方法吗?或者我应该研究或考虑其他方法吗?

我已经看到OAuth被折腾了,它看起来是一个很好的解决方案,但仅仅对于一个简单的API来说,它是矫枉过正吗?

您可以使用 API 密钥。根据请求生成绑定到帐户的唯一哈希。然后检查密钥是否为有效密钥。只要 API 与使用他人密钥的人没有任何重大安全问题,就不需要授权。如果某人使用其他人的密钥出现问题,则身份验证将是合理的。

通常是通过cookie实现的。

客户端通过 POST 请求将其用户名和密码发送到您的 API(不要使用 GET,这是不安全的)。如果凭据是可接受的,则生成一个随机的、唯一的会话密钥,将其存储在您的身边,并将其以 cookie 的形式发送回客户端(请参阅setcookie())。

当客户端现在发出进一步的请求时,它们会随请求一起发送会话密钥 cookie。检查会话密钥是否与存储的密钥匹配$_COOKIE;如果是,则表示用户已通过身份验证。

请注意,这个最小示例容易受到试图猜测有效会话密钥的暴力攻击。您需要记录客户端在其 cookie 中发送的无效密钥,并在一段时间内阻止其 IP 地址以防止这种情况。

GET中的用户名/密码并不是执行此操作的好方法,因为即使API的功能比登录站点更有限,您也可能暴露整个用户帐户进行劫持。因此,最好将网站登录和 API 访问之间的关注点分开。

我不确定您处于哪种情况,但是:

  • 如果用户是某种类型的商业客户,他们在另一个网站中嵌入了某种类型的小部件或代码,那么最好使用范围限定为引荐来源网址域的 API 密钥(就像谷歌地图一样)。

  • 如果他们是最终用户,他们对API一无所知,但将使用由第三方构建的应用程序,那么oAuth可能是您最好的选择,否则您的用户可能会将他们的用户名/密码提供给未知的第三方。它更复杂,但从长远来看可能是值得的。

要开箱即用,您可以使用像3scale(http://www.3scale.net)这样的东西,它会为您处理大部分内容(免责声明,我在那里工作,所以调整偏见!)或者大多数语言都有oAuth的开源库(在PHP Zend-OAuth组件中可能会为您完成这项工作)。