服务器到服务器API安全性的OAuth

因此,过去几天我在互联网上搜索了API安全性“最佳实践”或技术,特别是对于从服务器到服务器(服务器到服务器)的可访问API.似乎有很多不同的意见,很难将它们合并为一个可行的想法.

据许多人说,OAuth是要走的路.根据是否希望不使用安全套接字协议,选择分别是OAuth 1.0A或OAuth 2.0.

关于OAuth,我的理解是OAuth 1.0A主要关注的是请求的数字标牌,而OAuth 2.0依赖底层HTTPS来保证完整性.我可以安全地做出以下假设吗?

假设:如果使用HTTPS,则不需要使用HMAC或任何形式的数字签名来防止重放攻击,中间人攻击并保持完整性.

这仍然留下授权,OAuth通过交换的令牌管理.但为什么它如此复杂?例如,我可以为所有服务器(私人消费者)提供全球唯一的用户名和秘密,以便每个“请求”都使用秘密,用户名和请求参数的一些散列进行“签名”吗?

据我所知,这意味着授权和身份验证.通过确认哈希来管理身份验证,并且禁止授权,因为严格地说,每个服务器对自己的资源具有相同的权限.

因此,在为服务器到服务器(或“双腿”)通信设计API时,最好的方法是什么?简单地使用HTTPS是安全的,然后使用个性化哈希对每个请求进行签名,这意味着身份验证,授权以及不需要维护状态/会话.

我可以理解,符合标准是开发人员编写代码来使用服务和一般的网络文化的好处,因此对OAuth的某些“子集”的吸引力听起来很有吸引力;我只是不确定这里是否需要它.

最佳答案
假设您的系统S1已与系统S2具有信任关系. OAuth所做的是提供一种机制,以便S1可以为S3提供S3访问权限.也就是说,使用S1的某些部分权限,S3可以被授予对S2进行操作的许可.它以S1控制的方式执行此操作.

问:“例如,我可以为所有服务器(私人消费者)提供全球唯一的用户名和秘密”
答:当然可以这样做.如果您在要与之交谈的每个系统上都有用户名和唯一密码,那么您就不需要OpenID或OAuth.但这变得非常难以管理. OAuth允许您在一个系统上拥有一个秘密,并根据一个秘密授权任意数量的其他系统.这是它存在的唯一原因.

如果你看看OAuth做了什么,它是否基本上会产生一个新的唯一共享秘密(称为令牌,但如果你愿意,你也可以称之为密码),以便给出每种类型的访问权限.该唯一秘密由S2生成,但是从S1传递到S3,并且可以由S3用作密码以访问S2.是S2“控制”访问. OAuth唯一能做的就是将令牌送到S3.这消除了设置密码的需要,并在系统之间手动携带密码.

当你谈到“两条腿”的通信时,问题是:它们之间是如何建立共享秘密的?如果您手动(即物理携带)并使用密码设置两个系统,则您不需要OAuth.但是如果你有很多系统,那就很麻烦了. N个系统需要(N *(N-1)/ 2)个密码.

通常,您要做的是让一台服务器充当“身份验证服务器”,并且每台服务器都与之建立信任关系.然后,您使用OAuth授权任何其他两个服务器之间的任何交互.这就是复杂性的全部意义所在.

一旦您拥有服务器之间的基本信任关系,您就可以在该签名请求或签名响应之上(出于不可否认的目的).

在设计服务时,您需要考虑可以提供访问的方式.例如,您是否希望限时访问仅在7天内有效?您想要“只读”访问吗?这将为它提供给S3的S2访问类型提供S1选项.

让我举一个具体的例子说明:雪是好的,你想去滑雪.滑雪场是开放的,但你所有的钱都在银行里.你想要做的是授权滑雪场从你的银行账户中提取资金.你不想把所有的钱都捐给滑雪场.您不完全信任他们的密码.因此,您首先联系银行,并安排“许可”以提取特定金额.这由一个标记表示.然后,您将该令牌传递到滑雪区.使用该令牌,滑雪场可以提取指定数量的资金.始终负责保护您的资金,银行负责定义您可以设置权限的交易种类. OAuth只是安全传递令牌的标准方法.

转载注明原文:服务器到服务器API安全性的OAuth - 代码日志