REST API 授权与认证(web + mobile)

我读过 oAuth、 Amazon REST API、 HTTP Basic/Digest 等等,但是我不能把它们都放在一起。这可能是最接近的情况-为移动应用程序创建 API-认证和授权

我想建立以 API 为中心的网站服务。所以(在开始的时候)我会在中间放一个 API,然后 网站(PHP + MySQL)会通过 CURL仿生人IPhone的网络接口连接起来。3个主客户端-3个 API 密钥。任何其他开发人员也可以通过 API 接口进行开发,他们可以获得自己的 API 密钥。API 操作会根据用户级别状态被接受或拒绝,如果我是一个管理员,我可以删除任何东西等,所有其他人只能操作他们的本地(帐户)数据。

首先,授权——我应该使用 oAuth + xAuth 还是我自己的某种实现(参见 http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/RESTAuthentication.html?r=9197) ?据我所知,在 Amazon 服务用户是 = = API 用户(具有 API 密钥)频道。在我的服务,我需要分离标准用户/帐户(谁注册的网站)和开发帐户(谁应该有他们的 API 密钥)。

所以我首先需要 授权 API 密钥然后是 对用户进行身份验证本身。如果我使用 Amazon 的方案来检查开发者的 API 密钥(授权他们的应用程序) ,我应该使用哪种方案来进行用户身份验证?

在(通过 HTTPS,HTTPBasic)发布我的用户名和密码后,我读到了通过 api.example.org/auth获得令牌,然后在以下每个请求中转发它。如果我同时在 仿生人网站上登录,如何管理令牌?如果我只在第一次请求时(传输用户名和密码时)使用 SSL,而在其他请求上只使用 HTTP,那么中间人攻击怎么样?这不是这个例子中的一个问题吗

58889 次浏览

一如既往,保护密钥的最佳方法是不传输密钥。

也就是说,我们通常使用一个方案,其中每个“ API 密钥”都有两部分: 一个非秘密 ID (例如1234)和一个秘密密钥(例如 byte [64])。

  • 如果您提供了一个 API 密钥,那么将其存储在您的系统中(加盐和散列) 服务的数据库。
  • 如果提供用户帐户(由密码保护) ,则存储 服务数据库中的密码(加盐和散列)

现在,当一个消费者 第一访问您的 API,连接,有他

  • 发送“ username”参数(“ john.doe”not secret)
  • 发送“ APIkeyID”参数(“1234”,不是 secret)

把他还给我

  • 从您的数据库(如果其中一个参数是错误的, 只要再给我一些可以重复使用的盐。 Sha1(用户名 + “ notvery secret”)。
  • 服务器的时间戳

使用者应该为会话持续时间存储 salt,以保持事情的快速和顺利,并且应该计算和保持客户机和服务器之间的时间偏移。

使用者现在应该计算 API 密钥和密码的加盐哈希值。这样,使用者的密码和 API 密钥与存储在数据库中的密码和 API 密钥具有完全相同的散列,但是不需要任何机密信息。

现在,当一个消费者 随后访问您的 API 时,要做实际工作,就需要他

  • 发送“ username”参数(“ john.doe”not secret)
  • 发送“ APIkeyID”参数(“1234”,不是 secret)
  • 发送“ RequestSalt”参数(byte [64] ,Random,not secret)
  • 发送“ RequestTimestamp”参数(根据客户端时间和已知偏移量计算)
  • 发送一个“ RequestToken”参数(hash (passwordhash + request _ salt + request _ time戳 + apikeyhash))

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

现在,服务器可以计算与客户机相同的 hash (passwordhash + request _ salt + request _ time戳 + apikeyhash) ,并确保

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