apisix~hmac-auth插件的使用

打印 上一主题 下一主题

主题 1971|帖子 1971|积分 5913

hmac-auth插件需要和 Consumer 一起使用,API 的使用者必须将密匙添加到请求头中以验证其请求,下面介绍它的主要用法
参数


  • algorithm 算法 默认hmac-sha256 ["hmac-sha1", "hmac-sha256", "hmac-sha512"],客户端请求头X-HMAC-ALGORITHM=hmac-sha256
  • clock_skew 签名允许的时间偏移(以秒为单元)
  • access_key Consumer 的 access_key 必须是唯一的,客户端请求时在请求头添加X-HMAC-ACCESS-KEY=access_key值
  • signed_headers 要在加密计算中使用的 headers 列表,客户端请求头X-HMAC-SIGNED-HEADERS
  • X-HMAC-SIGNATURE 客户端请求头中的签名
消耗者配置


  • 添加hmac-auth插件,配置access_key,类似于app_id
  • 这个消耗者有两个能力,除了hmac-auth以外,另有key-auth的能力,即简单的认证方式

签名生成的过程

接下来,我们将以下述请求为例,为你介绍签名生成公式的详细计算过程:
  1. curl -i http://127.0.0.1:9080/index.html?name=james&age=36 \
  2. -H "X-HMAC-SIGNED-HEADERS: User-Agent;x-custom-a" \
  3. -H "x-custom-a: test" \
  4. -H "User-Agent: curl/7.29.0"
复制代码

  • 上文请求默认的 HTTP Method 是 GET,得到 signing_string 为:
  1. "GET"
复制代码

  • 请求的 URI 是 /index.html,根据 HTTP Method + \n + HTTP URI 得到 signing_string 为:
  1. "GET
  2. /index.html"
复制代码

  • URL 中的 query 项是 name=james&age=36,假设 encode_uri_params 为 false,根据 canonical_query_string 的算法,重点是对 key 进行字典排序,得到 age=36&name=james;根据 HTTP Method + \n + HTTP URI + \n + canonical_query_string 得到 signing_string 为:
  1. "GET
  2. /index.html
  3. age=36&name=james"
复制代码

  • access_key 是 user-key,根据 HTTP Method + \n + HTTP URI + \n + canonical_query_string + \n + access_key 得到 signing_string 为:
  1. "GET
  2. /index.html
  3. age=36&name=james
  4. user-key"
复制代码

  • Date 是指 GMT 格式的日期,不能缺少,形如 Tue, 19 Jan 2021 11:33:20 GMT, 根据 HTTP Method + \n + HTTP URI + \n + canonical_query_string + \n + access_key + \n + Date 得到 signing_string 为:
  1. "GET
  2. /index.html
  3. age=36&name=james
  4. user-key
  5. Tue, 19 Jan 2021 11:33:20 GMT"
复制代码
因为人家apisix服务端lua插件源码,使用的是这种GMT格式,所以咱们使用者也需要跟人家保持一致,事实上,我更倾向于使用时间戳,没有日期格式和时区的问题


  • signed_headers_string 用来制定参与到签名的 headers,在上面示例中包罗 User-Agent: curl/7.29.0 和 x-custom-a: test。
根据 HTTP Method + \n + HTTP URI + \n + canonical_query_string + \n + access_key + \n + Date + \n + signed_headers_string + \n,得到完备的 signing_string 为:
  1. "GET
  2. /index.html
  3. age=36&name=james
  4. user-key
  5. Tue, 19 Jan 2021 11:33:20 GMT
  6. User-Agent:curl/7.29.0
  7. x-custom-a:test
  8. "
复制代码
Body请求体校验
当 validate_request_body 设置为 true 时,插件将计算请求 body 的 hmac-sha 值,并与请求 headers 中的 X-HMAC-DIGEST 的值进行校验。
X-HMAC-DIGEST: base64(hmac-sha(<body>))
  1. X-HMAC-DIGEST: base64(hmac-sha(<body>))
复制代码
假如没有请求 body,你可以将 X-HMAC-DIGEST 的值设置为空字符串的 HMAC-SHA。
留意:
当开启 body 校验时,为了计算请求 body 的 hmac-sha 值,该插件会把 body 加载到内存中,在请求 body 较大的环境下,大概会造成较高的内存消耗。
为了避免这种环境,你可以通过设置 max_req_body(默认值是 512KB)配置项来配置最大允许的 body 巨细,body 超过此巨细的请求会被拒绝。
测试插件

假设当前请求为:
  1. curl -i http://127.0.0.1:9080/index.html?name=james&age=36 \
  2. -H "X-HMAC-SIGNED-HEADERS: User-Agent;x-custom-a" \
  3. -H "x-custom-a: test" \
  4. -H "User-Agent: curl/7.29.0"
复制代码
通过以下 Python 代码为上述请求生成签名 SIGNATURE:
  1. import base64import hashlibimport hmacsecret = bytes('my-secret-key', 'utf-8')message = bytes("""GET
  2. /index.html
  3. age=36&name=james
  4. user-key
  5. Tue, 19 Jan 2021 11:33:20 GMT
  6. User-Agent:curl/7.29.0
  7. x-custom-a:test
  8. """, 'utf-8')hash = hmac.new(secret, message, hashlib.sha256)# to lowercase base64print(base64.b64encode(hash.digest()))
复制代码
TypeHashSIGNATURE8XV1GB7Tq23OJcoz6wjqTs4ZLxr9DiLoY4PxzScWGYg=你也可以参考 Generating HMAC signatures 了解如何使用差别的编程语言生成签名。
签名生成后,你可以通过以下示例使用生成的签名发起请求:
  1. curl -i "http://127.0.0.1:9080/index.html?name=james&age=36" \
  2. -H "X-HMAC-SIGNATURE: 8XV1GB7Tq23OJcoz6wjqTs4ZLxr9DiLoY4PxzScWGYg=" \
  3. -H "X-HMAC-ALGORITHM: hmac-sha256" \
  4. -H "X-HMAC-ACCESS-KEY: user-key" \
  5. -H "Date: Tue, 19 Jan 2021 11:33:20 GMT" \
  6. -H "X-HMAC-SIGNED-HEADERS: User-Agent;x-custom-a" \
  7. -H "x-custom-a: test" \
  8. -H "User-Agent: curl/7.29.0"
  9. HTTP/1.1 200 OK
  10. Content-Type: text/html; charset=utf-8
  11. Transfer-Encoding: chunked
  12. Connection: keep-alive
  13. Date: Tue, 19 Jan 2021 11:33:20 GMT
  14. Server: APISIX/2.2
  15. ......
复制代码
你也可以将签名放到请求头 Authorization 字段中:
  1. curl http://127.0.0.1:9080/index.html \
  2. -H 'Authorization: hmac-auth-v1# + ACCESS_KEY + # + base64_encode(SIGNATURE) + # + ALGORITHM + # + DATE + # + SIGNED_HEADERS' -i
复制代码
postman测试结果
)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表