我想为用户构建一个 API 来构建可以轻松与站点交互的应用程序,我想知道验证用户的最佳方式是什么。
看看其他 API,其中很多是让用户通过 HTTPS 连接将用户名和密码作为 GET 参数发送。这是最好的方法吗?还是我应该研究或考虑其他方法?
我已经看到 OAuth 被抛来抛去,它看起来是一个很好的解决方案,但仅仅对于一个简单的 API 来说是不是有点矫枉过正?
GET 中的用户名/密码不是一个很好的方法,因为即使 API 的功能比登录站点更有限,您也可能会暴露整个用户帐户以进行劫持。因此,最好将网站登录和 API 访问之间的关注点分开。
我不确定您属于哪种情况,但是:
如果用户是某种商业客户,他们在另一个网站中嵌入了某种类型的小部件或代码,那么最好使用范围为引用域的 API 密钥(就像谷歌地图一样)。
如果他们是对 API 一无所知但将使用第三方构建的应用程序的最终用户,那么 oAuth 可能是您最好的选择,否则您的用户可能实际上会将他们的用户名/密码提供给未知的第三方派对。它更复杂,但从长远来看可能是值得的。
要开箱即用这些东西,您可以使用 3scale (http://www.3scale.net) 之类的东西,它会为您处理大部分内容(免责声明,我在那里工作,所以调整偏见!)或者在大多数语言中都有用于 oAuth 的开源库(在 PHP Zend-OAuth 组件中可能会为您完成这项工作)。
您可以使用 API 密钥。根据请求生成与帐户绑定的唯一哈希。然后检查该密钥是否为有效密钥。只要 API 对使用他人密钥的人没有任何重大安全问题,则不需要授权。如果有人使用其他人的密钥出现问题,那么身份验证将是合理的。
这通常是通过 cookie 实现的。
客户端通过POST请求将其用户名和密码发送到您的 API(不要使用GET,这是不安全的)。如果凭证是可接受的,则生成一个随机的、唯一的会话密钥,将其存储在您身边,并以 cookie 的形式将其发送回客户端(请参阅 参考资料setcookie()
)。
当客户端现在发出进一步的请求时,它们会随请求发送会话密钥 cookie。检查$_COOKIE
会话密钥是否与您存储的密钥匹配;如果是,则表示用户已通过身份验证。
请注意,这个最小示例很容易受到试图猜测有效会话密钥的暴力攻击。您需要记录客户端在其 cookie 中发送的无效密钥,并在一段时间内阻止其 IP 地址以防止这种情况发生。