Sha*_*una 97 security api restful-authentication
我正在为我维护的其中一个应用程序构建RESTful API.我们目前正在寻求构建各种需要更多受控访问和安全性的东西.在研究如何保护API时,我发现了一些关于使用什么形式的不同意见.我已经看到一些资源说HTTP-Auth是要走的路,而其他人更喜欢API密钥,甚至其他人(包括我在SO上找到的问题)都发誓OAuth.
然后,当然,那些喜欢API键的人说,OAuth是为代表用户访问的应用程序而设计的(据我所知,例如使用你的Facebook帐户登录非Facebook网站),而不是用户直接访问他们专门注册的网站上的资源(例如访问Twitter服务器的官方Twitter客户端).但是,OAuth的建议似乎甚至是最基本的身份验证需求.
那么我的问题是 - 假设它都是通过HTTPS完成的,三者之间有哪些实际差异?什么时候应该考虑其他人?
Sid*_*Sid 66
这取决于您的需求.你需要:
还是全部三个?
如果您只需要识别调用者以跟踪API调用的数量或数量,请使用简单的API密钥.请记住,如果您发布API密钥的用户与其他人共享,则他们也可以调用您的API.
但是,如果您还需要授权,那么您需要仅根据API的调用者提供对某些资源的访问权限,然后使用oAuth.
这是一个很好的描述:http://www.srimax.com/index.php/do-you-need-api-keys-api-identity-vs-authorization/
API 密钥甚至令牌属于直接身份验证和授权机制的类别,因为它们授予对 REST API 公开资源的访问权限。这种直接机制可以用在委托用例中。
为了访问 REST 端点公开的一个或一组资源,需要根据其身份检查请求者的权限。工作流程的第一步是通过验证请求来验证身份;后续步骤是根据一组定义的规则检查身份以授权访问级别(即读、写或读/写)。完成上述步骤后,典型的进一步关注是允许的请求速率,这意味着每秒允许请求者对给定资源执行多少个请求。
OAuth(开放授权)是一种用于委派访问的标准协议,主要互联网公司经常使用它来授予访问权限而无需提供密码。显然,OAuth 是满足上述问题的协议:通过代表资源所有者提供对服务器资源的安全委托访问来进行身份验证和授权。它基于访问令牌机制,允许第三方代表资源所有者访问服务器管理的资源。例如,一旦 John 授权了委托,ServiceX 想要代表 John 访问 John Smith 的 Google 帐户;然后,ServiceX 将获得一个基于时间的令牌来访问 Google 帐户详细信息,很可能仅限于读取访问。
API Key 的概念与上面描述的 OAuth Token 非常相似。主要区别在于没有委托:用户直接向服务提供商请求密钥以进行连续的编程交互。API 密钥的情况也是基于时间的:作为 OAuth 令牌的密钥受时间租赁或到期期限的约束。作为附加方面,密钥以及令牌可能受到服务合同的速率限制,即每秒只能服务给定数量的请求。
回顾一下,实际上,传统的身份验证和授权机制与基于密钥/令牌的版本之间没有真正的区别。不过,范例略有不同:不是在客户端和服务器之间的每次交互中重复使用凭据,而是使用支持密钥/令牌,这使得整体交互体验更流畅并且可能更安全(通常,遵循JWT标准,密钥和令牌由服务器进行数字签名以避免伪造)。
这两个类别都使用传统的身份验证工作流程来与拥有感兴趣资源的服务器进行首次交互。