【问题标题】:RESTful API check if a user has an active subscriptionRESTful API 检查用户是否有活动订阅
【发布时间】:2014-02-18 19:52:32
【问题描述】:

我正在构建一个 RESTful API,其中一部分将检查用户是否有有效的订阅。我正在考虑这样做:

GET https://api.example.org/subscriptions/me?username=johndoe&password=abc123&apikey=somekey HTTP/1.1
Host: api.example.org
Accept: application/json

HTTP/1.1 200 OK
Content-Type: application/json

{
    "username": "johndoe",
    "id": 5152,
    "valid": true,
    "valid_until": "2013-01-01 00:00:00",
    "account_level": "basic"
}

系统会返回以下状态码:

  • 如果用户订阅有效,则为 200
  • 如果省略了用户名或密码参数,则为 400
  • 如果用户凭据无效,则为 401
  • 如果用户没有有效的订阅,则为 402。
  • 如果用户的 API 密钥无效,则为 403
  • 如果是无效用户则为 404
  • 429 如果客户端发出了太多 API 请求

这是一个 RESTful API 设计吗?能不能做得更好? HTTP 403 是对无效 API 密钥的良好响应吗?

【问题讨论】:

  • 返回错误时,仍然可以在文档正文中返回json数据。这样,您可以向调用者提供有关问题所在的更多详细信息。 {code:nnn, message:'Invalid API Key'}

标签: http rest


【解决方案1】:

我个人会以用户为基础。用户有订阅。

我建议不要在 GET 请求中传递密码。没有人喜欢将明文密码存储在他们的历史记录中。您应该执行 POST /login 并设置适当的会话,这样就不需要对每个请求进行身份验证。如果您希望它完全无状态,请使用基本 HTTP 身份验证。

请求:

GET /users/5152
Accept: application/json
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

响应正文:

{
    "username": "johndoe",
    "password": "9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890c"
    "id": 5152,
    "valid": true,
    "valid_until": "2013-01-01 00:00:00",
    "account_level": "basic"
} 

状态代码:

  • 200 如果用户存在。检查下标状态客户端。
  • 如果省略了用户名或密码参数,则为 401
  • 如果用户凭据无效,则为 401
  • --- 如果用户没有有效的订阅。客户端出错
  • 如果用户不存在则为 404
  • 429 如果客户端发出了太多 API 请求

【讨论】:

  • 我喜欢这个。如果用户存在但没有订阅,返回 402 Payment Required 会不会不合适?
  • 是的。这是不合适的,因为如果您将其视为用户实体,则无需付款即可检索用户信息。您需要付款才能获得有效订阅。如果订阅无效,应该是客户端报错。
  • 基本身份验证仅通过 HTTPS 安全。在纯 HTTP 上,您必须使用 Digest。
  • 好点。基本身份验证仅是 base 64 编码,而不是散列。所以它很容易受到中间人的攻击。然而,摘要也容易受到相同的攻击,并且还规定了密码在服务器上的存储方式,不允许使用更强的哈希值。
【解决方案2】:

向任何经过身份验证的用户发送任意用户的密码哈希并不是一个好主意。

【讨论】:

    猜你喜欢
    • 2019-11-26
    • 2017-07-13
    • 2016-05-01
    • 2016-09-30
    • 2016-12-29
    • 1970-01-01
    • 2020-02-23
    • 2013-06-17
    • 1970-01-01
    相关资源
    最近更新 更多