REST Web服务和API密钥

sla*_*197 7 ajax rest web-services api-key

我有一个Web服务,我正在向用户提供进入我的应用程序数据库并获取一些信息.用户必须注册API密钥并在提出请求时提供.一切正常,但我如何检查注册密钥的用户是否实际提出请求而不是他可能已经提供密钥的其他人?

在过去的两天里,我一直在考虑提出一个解决方案,但到目前为止还没有.

lau*_*ent 12

您需要使用已签名的请求.基本上它的工作原理如下:

  • 您为用户提供了一个API密钥一个只有您和客户知道的"秘密"(随机字符串).
  • 每当他们发出请求时,他们都会向其添加"签名"参数.此签名基本上是请求参数的散列+ API密钥+其他参数(见下文)+秘密.
  • 既然你也知道这个秘密,你可以验证签名是否正确.

为了避免重放攻击,您还可以在混合中添加随机数和时间戳.nonce只是一个必须在每个请求上由客户端递增的数字.当您收到请求时,检查您之前是否已收到此nonce/timestamp.如果您这样做,则拒绝该请求(因为它很可能是重播攻击).如果没有,则将nonce/timestamp存储在数据库中,以便以后查找.

这或多或少是在OAuth中签署请求的方式.看看他们在链接中的例子.