RESTful API 身份验证

Posted

技术标签:

【中文标题】RESTful API 身份验证【英文标题】:RESTful API Authentication 【发布时间】:2011-11-28 05:24:19 【问题描述】:

我在 SO 上找到了很多关于这个主题的问题,但找不到任何答案:

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

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

更新

如果其他读者好奇我最终使用了什么,我决定复制亚马逊如何进行验证(很好的解释here:https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf)

【问题讨论】:

感谢更新。谢谢。 链接已失效,请考虑更新。更新链接:ida.liu.se/~TDP024/labs/hmacarticle.pdf 链接:acaasia.blogspot.co.il/2013/04/… 【参考方案1】:

您可以使用基于 SSL 的 HTTP 身份验证,这已经足够安全了。然而,它使 API 的使用变得有点困难,因为它需要客户端库来支持 SSL。如果您期望同时调用太多,SSL 也会影响性能。

API 密钥选项与没有 SSL 的 HTTP 身份验证一样不安全。如果您不关心安全性,那么 API 密钥对于 API 的使用者来说是最简单的。

【讨论】:

那么,如果你走 API 密钥路线,是否值得让用户输入密码?似乎 API 密钥可以摆脱大部分(如果不是全部)拥有密码的目的 @Obto 用户名可以顺序生成,密码可以随机生成。认证凭证的更多部分;破解密码的时间越长越难。这真的是一个品味问题。具有连续和随机部分的较长 API 密钥或单独的用户名和密码。 API 密钥通常不是人类可读和自动生成的(在这种情况下密码是多余的)。 所以说到底,这听起来真的只是你自己的喜好 @Obto 确实如此,否则雅虎、谷歌、亚马逊都有相同的最佳选择。 不错,幸运的是,我找到了一篇关于亚马逊如何进行身份验证的精彩文章,所以我将沿着这条路走。【参考方案2】:

一种好方法是使用登录方法,获取用户名和密码(希望通过 TLS)。如果他们成功认证,你会给他们一个过期的令牌;他们的其余 API 调用必须包含此令牌才能成功。

【讨论】:

@Hasan Khan 请注意,令牌不需要以共享状态存储;它可以简单地使用服务器端秘密确定性地创建(例如,使用秘密散列的日期、使用秘密散列的小时或可逆加密的时间戳)。因此,您可以使用有状态的存储,它可能会毫无问题地扩展到每秒至少数千个请求,并在需要时选择性能更高的选项。

以上是关于RESTful API 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

是否根据身份验证凭据 RESTful 返回不同的输出?

通过 restful api 进行 Azure AD 身份验证

没有身份验证的 Laravel 5.3 RESTFul API

如何存储 RESTful API 的身份验证数据

电话号码的 RESTful 设备特定身份验证

在 RESTful API 中存储身份验证令牌的位置?