我们在设计一个网站或平台的时候 , 经常需要向用户开放 API 访问 。这样用户就可以程序化地调用一些功能,举几个例子:
- 交易所开放 API 让用户可以进行低时延的程序化交易 ,
- 微信公众号平台开放 API 让三方工具进行运营管理工作,
- Stripe 开放 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(在服务器端生成) 。如果两者匹配,请求的资源将返回给客户端 。
【如何设计安全的 API 调用?】
推荐阅读
- 如何编写可扩展的Java程序,面对未来需求
- TensorRT是如何做到架构更快的?
- 修复来自开源和遗留程序的旧的、不安全的代码的三种方法
- 阻碍网络安全自动化的四大挑战
- 前端常用设计模式初探
- 如何理解Java中的多态
- 解密 Python 如何调用 Rust 编译生成的动态链接库
- 系统设计概念:生产 Web 应用的架构
- QQ如何用指纹解锁
- 怎么成为淘宝买菜的团长 如何申请成为淘宝买菜团长