REST API授权和authentication(网页+手机)

我已阅读oAuth,亚马逊REST API,HTTP基本/摘要等,但不能把它全部“一块”。 这可能是最接近的情况 – 为移动应用程序创buildAPI – 身份validation和授权

我想build立以API为中心的网站 – 服务。 所以(一开始)我会有一个API在中心和网站 (PHP + MySQL)通过networking接口通过cURLAndroidiPhone连接。 所以3个主要客户 – 3个API密钥。 而任何其他开发者也可以通过API接口开发,他们将获得自己的API密钥。 API行为将被接受/拒绝基于userLevel状态,如果我是一个pipe理员我可以删除任何东西等,所有其他可以操纵只有他们的本地(帐户)数据。

首先,授权 – 我应该使用oAuth + xAuth还是我自己的某种types的实现(请参阅http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/RESTAuthentication.html?r=9197 )? 据我所知,在亚马逊服务用户是== API用户(有API密钥) 。 在我的服务上,我需要将标准用户/帐户(在网站上注册的用户)和开发者帐户(应该有他们的API密钥)分开。

所以我首先需要授权API密钥 ,然后validation用户本身。 如果我使用亚马逊的scheme来检查开发人员的API密钥(授权他们的应用程序),我应该使用什么样的用户身份validation?

我读了关于通过api.example.org/auth (通过HTTPS ,HTTP Basic)发布我的用户名和密码,然后每转发一次请求。 如果我在Android网站上同时login,如何pipe理令牌? 如果我只在第一次请求时(在传输用户名和密码的时候)只使用SSL,而在另一端只使用HTTP,那么中间人攻击又如何呢? 在这个例子中是不是一个问题保护REST服务的密码?

总而言之,保护密钥的最好方法不是传输密钥。

也就是说,我们通常使用一个scheme,其中每个“API密钥”包含两个部分:非秘密ID(例如1234)和密钥(例如字节[64])。

  • 如果您发出API密钥,请将其存储(腌制和散列)到您服务的数据库中。
  • 如果您发出用户帐户(由密码保护),请将密码(腌制和散列)存储在服务的数据库中

现在,当一个用户首先访问你的API,连接,拥有他

  • 发送一个“用户名”参数(“john.doe”不是秘密)
  • 发送一个“APIkeyID”参数(“1234”,不是秘密)

把他还给他

  • 从你的数据库中的盐(如果其中一个参数是错误的,只要给出一些可重复的盐 – 例如。sha1(username +“notverysecret”)。
  • 服务器的时间戳

消费者应该存储会话持续时间以保持事情的快速和平稳,并且应该计算并保持客户端和服务器之间的时间偏移。

消费者现在应该计算API密钥和密码的腌制哈希值。 通过这种方式,消费者拥有与密码和API密钥完全相同的哈希值,就像存储在数据库中的哈希一样,但是没有任何东西可以通过networking传递。

现在,当消费者随后访问你的API,做实际工作,拥有他

  • 发送一个“用户名”参数(“john.doe”不是秘密)
  • 发送一个“APIkeyID”参数(“1234”,不是秘密)
  • 发送一个“RequestSalt”参数(字节[64],随机,而不是秘密)
  • 发送一个“RequestTimestamp”参数(从客户端时间和已知偏移量计算)
  • 发送一个“RequestToken”参数(hash(passwordhash + request_salt + request_timestamp + apikeyhash))

服务器不应该接受超过2秒的时间戳,以防止重放攻击。

服务器现在可以计算出与客户端相同的散列(passwordhash + request_salt + request_timestamp + apikeyhash),并且确定

  • 客户端知道API密钥,
  • 客户端知道正确的密码