我读过oAuth、Amazon REST API、HTTP Basic/Digest等,但无法将其全部纳入"单件".这可能是最接近的情况——Creating an API for mobile applications - Authentication and Authorization

我想建立以API为中心的网站服务.所以(一开始)我中间会有一个API,website(PHP+MySQL)会通过cURLAndroidiPhone通过它们的网络接口进行连接.所以有3个主客户端-3个API密钥.任何其他开发人员也可以通过API接口进行开发,他们将获得自己的API密钥.API操作将根据userLevel状态被接受/拒绝,如果我是管理员,我可以删除任何内容等,所有其他人只能操作他们的本地(帐户)数据.

首先,授权-我应该使用OAuth+xAuth还是我自己的某种实现(参见http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/RESTAuthentication.html?r=9197)?据我所知,在Amazon service user is == API user (have API key)号.在我的服务上,我需要将标准用户/帐户(在网站上注册的用户)和开发人员帐户(谁应该有他们的API密钥)分开.

所以我首先需要authorize the API key,然后是Authenticate the user.如果我使用亚马逊的方案来判断开发者的API密钥(授权他们的应用程序),我应该使用哪个sheme来进行用户身份验证?

我读到在(通过HTTPS,HTTP Basic)发布用户名和密码之后通过api.example.org/auth获得令牌,然后在每次后续请求时转发它.如果我同时在Androidwebsite上登录,如何管理令牌?如果我只在第一个请求上使用SSL(在传输用户名和密码时),而在其他请求上只使用HTTP,那么中间人攻击怎么办?这在本例中不是一个问题吗Password protecting a REST service?

推荐答案

一如既往,保护密钥的最佳方式是不传输它.

也就是说,我们通常使用一个方案,其中每个"API密钥"都有两部分:一个非机密ID(例如1234)和一个机密密钥(例如字节[64]).

  • 如果你给出了一个API密钥,把它存储在你的内存中(用盐腌过的和散列过的)
  • 如果您分发用户帐户(受密码保护),请将 服务数据库中的密码(加盐和哈希)

现在,当消费者first访问您的API时,为了连接,让他

  • 发送"username"参数("John.Doe"非机密)
  • 发送"APIkeyID"参数("1234",非机密)

把他还给我

  • 数据库中的盐(如果其中一个参数错误,
  • 服务器的时间戳

消费者应该将盐存储在会话持续时间内,以保持快速和顺畅,并计算和保存客户端和服务器之间的时间偏差.

消费者现在应该计算API密钥和密码的盐散列.这样一来,消费者对密码和API密钥的哈希值与存储在数据库中的哈希值完全相同,但不会出现任何异常情况.

现在,当消费者subseqently访问你的API时,为了做真正的工作,让他

  • 发送"username"参数("John.Doe"非机密)
  • 发送"APIkeyID"参数("1234",非机密)
  • 发送"RequestSalt"参数(字节[64],随机,非机密)
  • 发送"RequestTimestamp"参数(根据客户端时间和已知偏移量计算)
  • 发送"RequestToken"参数(hash(passwordhash+request_salt+request_timestamp+apikeyhash))

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

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

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

Php相关问答推荐

更新WooCommerce高性能订单存储(HPOS)的管理员自定义订单元数据

在PHP中结合每周日程安排和特殊日子查找下一个可用日期

PHP Array to Powershell exec命令Args

在WooCommerce管理订单页面中显示区域名称

msgraph-sdk-php v2如何传递skiptoken到request?

Mysqli_stmt::Execute():结果字段元数据中存在过早的EOF

保存PHP条带以备将来使用,不显示用户界面

使用PHP curl的Amazon SP API批处理调用

使注册字段UserMeta值对于WooCommerce中的每个用户是唯一的

从目录文件夹中获取文件并追加到 Select 下拉列表(选项)-wordpress/wc

如何将WooCommerce产品从一个产品复制到另一个产品S

从字符串转换日期和/或时间时,Laravel转换失败

如何用Ubuntu 22.04在VSCode中启用XDebug

htaccess 重定向子域错误的 url

根据所选付款方式启用/禁用 WooCommerce 所需的 checkout 字段

如何在WooCommerce中为访客购买者分配自定义客户代码

将Shopware 6后端中定义的值导入MultiFilter

Symfony 迁移判断器在我的工作中失控

判断类别是否存在 Shopware 6

计算组合指数