中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

apisix~hmac-auth插件的使(shi)用

hmac-auth插件需要(yao)和 Consumer 一起(qi)使(shi)用(yong),API 的使(shi)用(yong)者必須將密匙添加到請求頭中以驗證其請求,下面(mian)介紹它的主(zhu)要(yao)用(yong)法

參數

  • 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的能力,即簡單的認證方式

簽名生成的過程

接下來,我們將以下述(shu)請(qing)求為例,為你介紹簽名生成公式(shi)的具(ju)體計算(suan)過程:

curl -i //127.0.0.1:9080/index.html?name=james&age=36 \
-H "X-HMAC-SIGNED-HEADERS: User-Agent;x-custom-a" \
-H "x-custom-a: test" \
-H "User-Agent: curl/7.29.0"
  1. 上文請求默認的 HTTP Method 是 GET,得到 signing_string 為:
"GET"
  1. 請求的 URI 是 /index.html,根據 HTTP Method + \n + HTTP URI 得到 signing_string 為:
"GET
/index.html"
  1. 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 為:
"GET
/index.html
age=36&name=james"
  1. access_key 是 user-key,根據 HTTP Method + \n + HTTP URI + \n + canonical_query_string + \n + access_key 得到 signing_string 為:
"GET
/index.html
age=36&name=james
user-key"
  1. 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 為:
"GET
/index.html
age=36&name=james
user-key
Tue, 19 Jan 2021 11:33:20 GMT"

因為人家apisix服務端(duan)lua插件源(yuan)碼,使用(yong)的(de)是這種GMT格式,所(suo)以(yi)咱(zan)們使用(yong)者也需要跟人家保持(chi)一致,事實(shi)上,我(wo)更(geng)傾向于(yu)使用(yong)時間戳,沒有日期(qi)格式和(he)時區的(de)問題

  1. 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 為:

"GET
/index.html
age=36&name=james
user-key
Tue, 19 Jan 2021 11:33:20 GMT
User-Agent:curl/7.29.0
x-custom-a:test
"

Body請求體校驗

當 validate_request_body 設置為 true 時(shi),插件將計(ji)算請求 body 的(de) hmac-sha 值,并與請求 headers 中(zhong)的(de) X-HMAC-DIGEST 的(de)值進行校驗。

X-HMAC-DIGEST: base64(hmac-sha())

X-HMAC-DIGEST: base64(hmac-sha(<body>))

如果沒(mei)有請求 body,你可以(yi)將 X-HMAC-DIGEST 的(de)值(zhi)設置為空(kong)字符(fu)串的(de) HMAC-SHA。

注意:
當開啟 body 校驗時,為了計算請求 body 的 hmac-sha 值,該插件會把 body 加載到內存中,在請求 body 較大的情況下,可能會造成較高的內存消耗。
為了避免這種情況,你可以通過(guo)設置(zhi) max_req_body(默認值是 512KB)配(pei)置(zhi)項來配(pei)置(zhi)最大(da)允許的(de) body 大(da)小(xiao),body 超(chao)過(guo)此(ci)大(da)小(xiao)的(de)請求會被拒絕。

測試插件

假設當前請求為:

curl -i //127.0.0.1:9080/index.html?name=james&age=36 \
-H "X-HMAC-SIGNED-HEADERS: User-Agent;x-custom-a" \
-H "x-custom-a: test" \
-H "User-Agent: curl/7.29.0"

通過以下(xia) Python 代(dai)碼為上述請(qing)求生(sheng)成簽名 SIGNATURE:

import base64
import hashlib
import hmac

secret = bytes('my-secret-key', 'utf-8')
message = bytes("""GET
/index.html
age=36&name=james
user-key
Tue, 19 Jan 2021 11:33:20 GMT
User-Agent:curl/7.29.0
x-custom-a:test
""", 'utf-8')

hash = hmac.new(secret, message, hashlib.sha256)

# to lowercase base64
print(base64.b64encode(hash.digest()))
Type Hash
SIGNATURE 8XV1GB7Tq23OJcoz6wjqTs4ZLxr9DiLoY4PxzScWGYg=

你也(ye)可以參(can)考 Generating HMAC signatures 了解(jie)如何使用不同的編程語言生(sheng)成簽名。

簽名生成后,你(ni)可(ke)以(yi)通過(guo)以(yi)下示例(li)使用生成的簽名發起請求:

curl -i "//127.0.0.1:9080/index.html?name=james&age=36" \
-H "X-HMAC-SIGNATURE: 8XV1GB7Tq23OJcoz6wjqTs4ZLxr9DiLoY4PxzScWGYg=" \
-H "X-HMAC-ALGORITHM: hmac-sha256" \
-H "X-HMAC-ACCESS-KEY: user-key" \
-H "Date: Tue, 19 Jan 2021 11:33:20 GMT" \
-H "X-HMAC-SIGNED-HEADERS: User-Agent;x-custom-a" \
-H "x-custom-a: test" \
-H "User-Agent: curl/7.29.0"

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Date: Tue, 19 Jan 2021 11:33:20 GMT
Server: APISIX/2.2
......

你也可以將簽(qian)名(ming)放到請求頭 Authorization 字段中:

curl //127.0.0.1:9080/index.html \
-H 'Authorization: hmac-auth-v1# + ACCESS_KEY + # + base64_encode(SIGNATURE) + # + ALGORITHM + # + DATE + # + SIGNED_HEADERS' -i

postman測試結果

)

posted @ 2025-03-28 15:10  張占嶺  閱讀(369)  評論(0)    收藏  舉報