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