实现两条腿的OAuth提供程序

实现两条腿的OAuth提供程序,oauth,2-legged,oauth-provider,Oauth,2 Legged,Oauth Provider,我正试图找到解决OAuth规范、它的需求和我能找到的任何实现的方法,到目前为止,它看起来确实比它的价值更麻烦,因为我很难找到一个单一的资源来将它整合在一起。或者可能只是我在寻找比大多数教程更专业的东西 我有一套现有的API——一些是Java的,一些是PHP的——我现在需要保护这些API,而且出于一些原因,OAuth似乎是正确的选择。不幸的是,我无法找到合适的资源来帮助我建立和运行一个提供商,这对这一理论是一个挑战。因为其中大部分都是系统对系统API的使用,所以我需要实现一个两条腿的提供者。考虑到

我正试图找到解决OAuth规范、它的需求和我能找到的任何实现的方法,到目前为止,它看起来确实比它的价值更麻烦,因为我很难找到一个单一的资源来将它整合在一起。或者可能只是我在寻找比大多数教程更专业的东西

我有一套现有的API——一些是Java的,一些是PHP的——我现在需要保护这些API,而且出于一些原因,OAuth似乎是正确的选择。不幸的是,我无法找到合适的资源来帮助我建立和运行一个提供商,这对这一理论是一个挑战。因为其中大部分都是系统对系统API的使用,所以我需要实现一个两条腿的提供者。考虑到这一点

  • 有人知道用PHP实现两条腿的OAuth提供程序的好教程吗
  • 考虑到我有两种语言的安全API,我是否需要用这两种语言实现一个提供程序,或者是否有一种方法将提供程序创建为一个“前端控制器”,我可以将所有请求导入其中
  • 例如,在保护PHP服务时,我是否必须通过在每个API上包含必需的提供者资源来单独保护每个API

  • 谢谢你的帮助。

    我会退一步,想想一个经过适当身份验证的客户端将向你发送什么

    您能否将密钥和凭据存储在一个公共数据库中,该数据库可以从这两组服务访问,并且只使用一种语言实现OAuth提供程序?当用户向服务(PHP或Java)发送请求时,您可以对照公共存储进行检查。当用户设置OAuth客户端时,您可以通过PHP或Java应用程序(您的首选)完成所有这些操作,并将凭据存储在公共数据库中

    有一些Oauth提供程序是用其他语言编写的,您可能想看看:

    • PHP-(参见页面底部)
    • 红宝石
    • .NET

      • 罗布,我不知道你是在哪里发现这个问题的,但我想加上我的2美分,以防其他人碰到这个问题

        几个月前,我或多或少有过同样的问题,在一年的大部分时间里,我都在听“OAuth”。我正在开发一个需要保护的RESTAPI,所以我开始阅读OAuth。。。然后我的眼睛开始在我的头上向后滚动

        我可能花了整整一两天的时间浏览和阅读,直到我和你们一样,觉得OAuth是个令人困惑的垃圾,于是放弃了它

        因此,我开始研究保护API的方法,并开始更好地掌握保护API的方法。最流行的方式似乎是向API发送请求以及整个消息(使用只有您和服务器知道的秘密编码)的校验和,服务器可以使用该校验和来确定消息在从客户端发送的过程中是否被篡改,如下所示:

      • 客户端发送/user.json/123?showFriends=true&showStats=true&checksum=kjDSiuas98SD987ad
      • 服务器获取所有这些信息,在数据库中查找用户“123”,加载他的密钥,然后(使用客户端使用的相同方法)根据请求参数重新计算自己的校验和
      • 如果服务器生成的校验和与客户机发送的校验和匹配,则请求正常并执行,如果不匹配,则视为被篡改并被拒绝
      • 校验和被称为HMAC,如果你想要一个很好的例子,它就是Amazon Web服务使用的(他们称参数为“签名”而不是“校验和”)

        因此,考虑到这项工作的关键组件之一是客户机和服务器必须以相同的方式生成HMAC(否则它们将不匹配),必须有关于如何组合所有参数的规则。。。然后我突然明白了OAuth所有的“参数的自然字节排序”废话。。。它只是定义了如何生成签名的规则,因为它需要

        另一点是,在HMAC生成中包含的每个参数都是一个值,在发送请求时不能对其进行篡改

        因此,如果您只是将URI干编码为签名,例如:

        • /user.json==askJdla9/kjdas+Askj2l8add
        那么消息中唯一不能篡改的就是URI,所有参数都可以篡改,因为它们不是服务器将重新计算的“校验和”值的一部分

        或者,即使您在计算中包含每个参数,您仍然会面临“重播攻击”的风险,其中恶意中间人或被窃听者可以拦截API调用并不断地将其重新发送到服务器

        您也可以通过在HMAC计算中添加时间戳(始终使用UTC)来解决此问题

        提醒:由于服务器需要计算相同的HMAC,因此您必须发送计算中使用的任何值,除了您的密钥(我认为OAuth称之为消费者密钥)。因此,如果您添加了时间戳,请确保在请求时发送时间戳参数

        如果要使API免受重播攻击,可以使用nonce值(这是服务器生成的一次性使用值,提供给客户端,客户端在HMAC中使用它,发送回请求,服务器确认,然后在DB中将该nonce值标记为“已用”,并且决不允许其他请求再次使用它)

        注意:“nonce”是解决“重播攻击”问题的一种非常准确的方法——时间戳很好,但因为计算机并不总是具有同步的时间戳值,所以在我们接受或拒绝请求之前,必须在服务器端允许一个可接受的窗口,显示请求的“旧”程度(例如10分钟、30分钟、1小时……亚马逊使用15分钟)。在这种情况下,您的API在整个时间窗口内都存在技术漏洞

        我认为nonce值很好,但应该只需要在API中使用,这些API对于保持完整性至关重要。在我的API中,我没有