RESTful API身份认证

16

我在SO上发现了很多关于这个主题的问题,但没有找到任何一个回答这个问题:

我应该用用户名和密码验证用户,还是使用API密钥?每种方法的利弊是什么。

我之所以问这个问题,是因为在我的API中,有几个方法我想要锁定并验证用户是否有权限访问某些文档或操作。我有点不愿意通过让用户发送带有其用户名和密码的HTTP AUTH头进行身份验证,因为它感觉不安全,对用户来说也有点麻烦。另一方面,如果我使用API密钥,用户创建密码有什么意义呢?因为他们将不再使用它来访问API的功能。

更新

如果其他读者对此感到好奇,我决定复制Amazon如何验证的方式(这里有一个好的解释:这里https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf)。


2
感谢更新。谢谢。 - Nick Zalutskiy
链接已经失效,请考虑更新。更新后的链接为:https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf - Viv
链接:http://acaasia.blogspot.co.il/2013/04/designing-secure-rest-web-api-without.html - OhadR
2个回答

7
您可以在SSL上使用HTTP身份验证,这样足够安全。但是,如果需要客户端库支持SSL,它会使API的使用略微困难。如果您期望同时接收太多调用,则SSL也可能影响性能。
如果没有SSL,API密钥选项与HTTP身份验证同样不安全。如果您不关心安全性,那么API密钥对于API的消费者是最简单的选择。

如果您选择使用API密钥,那么让用户设置密码是否还有意义呢?看起来API密钥已经消除了大部分甚至全部需要设置密码的目的。 - Obto
@Obto 用户名可以按顺序生成,密码可以随机生成。认证凭据的部分越多,密码就越长、越难破解。这实际上是个人口味问题。可以选择一个带有顺序和随机部分的较长 API 密钥,或者选择单独的用户名和密码。API 密钥通常不可读且自动生成(在这种情况下,密码是多余的)。 - Muhammad Hasan Khan
最终,听起来似乎只是取决于你自己的偏好。 - Obto
@Obto确实,否则Yahoo、Google和Amazon都有相同的最佳选项。 - Muhammad Hasan Khan
没错,幸运的是我找到了一篇关于亚马逊如何进行身份验证的好文章,所以我打算走这条路线。 - Obto

5

一个好的方法是使用登录方法,输入用户名和密码(最好通过TLS)。如果他们成功验证,给他们一个过期的令牌;其余的API调用必须包含此令牌才能成功。


注意,令牌不一定需要存储在共享状态中;它可以使用服务器端秘密进行确定性创建(例如,使用秘密哈希的日期、使用秘密哈希的小时或可逆加密的时间戳)。因此,您可以使用有状态存储,它可能会扩展到每秒至少数千个请求而无需问题,并在需要时选择更高效的选项。 - Eamon Nerbonne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接