如何设计安全的 API 调用?

2023年 11月 30日 26.0k 0

如何为网站设计安全的 API 访问?

我们在设计一个网站或平台的时候,经常需要向用户开放 API 访问。这样用户就可以程序化地调用一些功能,举几个例子:

  • 交易所开放 API 让用户可以进行低时延的程序化交易,
  • 微信公众号平台开放 API 让三方工具进行运营管理工作,
  • Stripe 开放 API 让商家和其他平台能很好地集成支付功能。
  • 当我们向用户开放 API 访问时,我们需要确保每次 API 调用都经过鉴权。这意味着我们需要确认用户是他们所声称的身份。

    我们一般使用两种常见的方法来进行鉴权:

  • 基于令牌的身份验证
  • HMAC(基于哈希的消息验证码)验证
  • 下图说明了它们的工作原理。

    图片

    01 基于令牌

    第 1 步

    用户在客户端输入密码,然后客户端将密码发送到鉴权服务器。

    第 2 步

    鉴权服务器验证密码并生成一个有有效期的令牌。

    第 3 步和第 4 步

    现在,客户端可以发送请求,使用 HTTP 头中带有的令牌访问服务器资源。这种访问在令牌过期前一直有效。

    02 基于 HMAC

    这种机制通过使用哈希函数(SHA256 或 MD5)生成消息验证码(签名)。

    第 1 步和第 2 步

    服务器生成两个密钥,一个是公共 APP ID(公钥),另一个是 API Key(私钥)。

    第 3 步

    现在我们在客户端生成一个 HMAC 签名(hmac A)。该签名是根据图中列出的一组字段生成的。注意这里会加入请求的时间戳,这样一个 HMAC 签名是有有效期的,不会一直有效。

    第 4 步

    客户端发送请求来访问服务器资源,HTTP 头中包含 hmac A。

    第 5 步

    服务器收到包含请求数据和鉴权标头的请求。它从请求中提取必要的字段,并使用存储在服务器端的 API Key 生成签名(hmac B)。

    第 6 步和第 7 步

    服务器会比较 hmac A(在客户端生成)和 hmac B(在服务器端生成)。如果两者匹配,请求的资源将返回给客户端。

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论