API设计和身份验证注意事项

时间:2011-05-06 21:56:13

标签: java api

我有一个数据版本控制系统在某些RDBMS中作为时间点架构实现。我正在编写一个基于servlet的API来公开有关这些数据的一些功能。 API将向用户返回数据点,允许用户标记要删除的数据,并允许超级用户接受或拒绝这些数据修改请求,也可通过API调用完成。

这是问题所在。我已经处理了一些大而值得注意的API,它具有非常多样化的功能集,其中所有API调用都是HTTPS GET。这就是我计划这样做的方式。我知道,我知道,如果您正在开发面向资源的产品,那么在一个完美的世界中,您应该设计一个实现为REST接口的ROA。但是,客户真的希望有一个更加混合的RPC风格界面,以提高可读性和低学习曲线。如果我按照GET的方式做所有事情,以客户想要的格式获取API调用,这是件坏事吗?有什么东西会回来后来在后端咬我?对未来的API添加或维护有不良影响吗?如果这种方法存在一些明显的陷阱,客户可以在没有太大惊小的情况下向另一个方向摇摆。

我不仅仅想做REST并使用GET / POST / etc http动词的原因之一是较低权限的用户只能进行更改请求。这些徘徊不前,直到更高的权限用户可以/拒绝它们。

示例电话: ?,某/方法= GetOutlierData&安培; SITEID = 112-1&安培; = TimeInterval所2011-01-01_00:00:00--2011-01-01_23:59:59&安培; ValidDate = 2011-02-01_12:00:00&安培;返回类型=的recordId&安培;请求者= 13&安培;密码=秘密&安培; ApiKey = 19483

响应: 返回= 0&安培; RecordsIds =

另一个地方我不确定我提议的是一个好主意是认证。每个调用都包含调用用户的凭据(强制执行角色 - 某些用户只能使用某些API功能)。 API将仅处理来自白名单上的主机的调用,因此API的设计意味着客户端将构建单个端点以路由其所有组织请求,并且该端点将提供秘密API密钥以及所有API调用。这将阻止用户将自己未经批准的呼叫直接发送到API。它们将是内部实施的一些速率限制和禁止功能,以防止故意和意外的DoS。既然我们通过SSL运行这是一种适当的做事方式吗?

示例电话: ?,某/方法=等等&安培; ...&安培;请求者= 13&安培;密码=秘密&安培; ApiKey = 1298593

2 个答案:

答案 0 :(得分:2)

对于非幂等操作使用GET请求没有任何固有的“坏处”,例如SOAP对所有操作使用GET(或POST?)。但是,某些Web浏览器会查看使用GET作为幂等的链接,并尝试为您预先获取它。如果该链接要在后端数据库上执行删除行,那么这是一件坏事。

答案 1 :(得分:1)

GET请求是幂等的。他们很安全。

浏览器,机器人,爬虫他们都会假设发送GET请求是一个安全的操作,不会删除或更改数据。

这再次构成了HTTP的设计。

在一个理想的世界中,你说服你的客户他想要一个REST服务。

如果失败则要求任何非幂等调用都是POST而不是GET