JWT
#
用途說明使用包含HS256或是RS256簽署的JSON Web Tokens(參考RFC 7519)對請求做驗證。每一個用戶都會擁有JWT憑證(公開或祕密金鑰)可以用來簽署JWTs。 權杖可透過下列方式傳送:
- 查詢字串(query string)
- Cookie
- HTTP 請求標頭
#
欄位配置說明變數 | 類型 | 預設值 | 說明 | 必填 |
---|---|---|---|---|
uri_param_names | array of string | jwt | 查詢字串的列表,API Manager會審查並從中取得JWTs。 | |
cookie_names | array of string | cookie的列表,API Manager會審查並從中取得JWTs。 | ||
header_names | array of string | authorization | HTTP標頭的列表,API Manager會審查並從中取得JWTs。 | |
claims_to_verify | array of string | 標準聲明內容列表使API Manager可以識別。可接受的項目有 exp 以及 nbf 。 | ||
key_claim_name | string | iss | 代表憑證中 key 的聲明名稱。插件會嘗試從JWT payload或是header以此順序讀取此聲明。 | |
secret_is_base64 | boolean | false | 開啟此項目,則插件會將憑證之祕鑰以base64做編碼。可以建立一個編碼過的祕鑰給用戶,用原本的祕鑰簽署JWT。 | V |
anonymous | string | 可設定"anonymous"使用者在驗證失敗時會使用此身份驗證。如此欄位為空,則請求之標頭沒帶上Authorization時會收到authentication failure 4xx的回應。要注意的是,此欄位需填入的是consumer本身之id,而不是custom_id。 | ||
run_on_preflight | boolean | true | 開啟此項設定會驗證preflight請求;關閉此項設定則會讓所有preflight請求通過。 | V |
maximum_expiration | number | 0 | 可設定0至31536000(365天)做為JWT的存活時間(單為為秒)。超過範圍的數字會收到拒絕訊息(HTTP狀態碼403)。如果設定此欄位,則在 claims_to_verify 中也必須填入 exp 的內容。 0 代表無限期。 |
#
用法示例#
在全局啟用插件- 從網站左邊Menu中
外掛插件
頁面中,點選右上角的新增外掛插件
:
- 點選後,選擇
認證
頁籤,並啟用JWT,填寫內容參考欄位配置說明,設定成功後,任何請求(不分服務、路由、用戶)皆需經過認證才能通過。
#
在服務端上啟用插件- 從網站左邊Menu中
服務 > 服務列表
頁面中,選擇要啟用此插件的服務,假設為google
,點選對應的編輯按鈕:
- 在編輯畫面中,點選上方的
外掛插件
頁籤,再點選頁籤內容上方的新增外掛插件
按鈕:
點選後,選擇 認證
頁籤,並啟用JWT,填寫內容參考欄位配置說明,設定成功後,僅有此服務(範例為google
)請求需經過認證才能通過。
#
在路由端上啟用插件可以由兩種方式來選擇路由,並啟用插件:
#
方式一:路由列表- 從網站左邊Menu中
服務 > 路由列表
頁面中,選擇要啟用此插件的路由,假設為google
,點選對應的編輯按鈕:
#
方式二:服務 > 服務列表 > 路由列表- 從網站左邊Menu中
服務 > 服務列表
頁面中,選擇要啟用此插件的路由 所屬之服務(假設為google
),點選對應的編輯按鈕。
在編輯畫面中,點選上方的 路由
頁籤,選擇要啟用此插件的路由(假設為google
),點選對應的編輯按鈕:
- 承第1步,點擊上述兩種方式之一的編輯按鈕後,在編輯畫面中,點選上方的
外掛插件
頁籤,再點選頁籤內容上方的新增外掛插件
按鈕:
點選新增外掛插件
按鈕後,選擇 認證
頁籤,並啟用JWT,填寫內容參考欄位配置說明,設定成功後,僅有此路由(範例為google
)請求需經過認證才能通過。
#
建立使用者及憑證從網站左邊Menu中
訂閱用戶 > 用戶列表
頁面中選擇右上方新增
按鈕,新增用戶。選擇剛建立的使用者,進入編輯頁面,選擇上方
憑證
頁籤,然後選擇左邊JWT
頁籤,再選擇列表左上方的新增
按鈕。
- 演算法部分可填入
HS256
、HS384
、HS512
、RS256
及ES256
。其它像金鑰欄位可以填入自己的金鑰或是留空自動生成,而RSA公開金鑰在演算法選擇RS256
或是ES256
時,必須填入公開金鑰(PEM格式)用來驗證權杖的簽署。如果演算法選擇HS256
或是ES256
則使用祕鑰簽署JWTs憑證,但祕鑰欄位如果留空會自動生成新的祕鑰。
- 如選擇演算法
HS256
。
- 如選擇演算法
RS256
。
#
驗證選擇一路由開啟此插件服務,並建立好使用者及憑證 (範例為將路由之域名設定為
google
,路徑設定為/index
,並開啟拆分路徑
)。此時在console上送出以下指令
會得到以下回應
代表插件正常運作,並阻擋未通過驗證之請求。
#
使用祕鑰建立JWT(HS256)JWT分為三個部分:header、payload、secret。
- header設定為
- payload的部分,需要包含
key_claim_name
的值,預設為iss
。 將其值設定為剛建立的憑證產生的金鑰。
- secret即為剛剛建立的憑證產生的祕鑰,並將以上三個部分使用JWT官網生成JWT權杖
之後送出請求時代入JWT權杖
即可得到正常的回應。
如果有設定 uri_param_names
也可用下列方式送出請求
#
使用公開/祕密金鑰建立JWT(RS256/ES256)JWT分為三個部分:header、payload、secret。
- header設定為
- payload的部分,需要包含
key_claim_name
的值,預設為iss
。 將其值設定為剛建立的憑證產生的金鑰。
- 使用JWT官網代入以上兩個資訊,再加上公開及祕密金鑰內容後生成JWT權杖
之後送出請求時代入JWT權杖
即可得到正常的回應。
如果有設定 uri_param_names
也可用下列方式送出請求
#
相關解釋#
聲明claims_to_verify
可支援 exp
以及 nbf
兩個選項,想要同時加入時可填入 exp,nbf
聲明名稱 | 驗證內容 |
---|---|
exp | JWT的過期時間,過期時間必須大於簽發JWT時間 |
nbf | 擬發放JWT之後,在某段時間點前該JWT仍舊是不可用的 |
#
Base64編碼祕鑰如果祕鑰中含有binary資料,可以將它們以base64做編碼。這時候要將 secret_is_base64
打開。在用戶底下建立憑證的時候必須將已編碼過的祕鑰代入祕鑰的欄位。而在建立JWT時則要使用原始的祕鑰。
#
生成公開/祕密金鑰想生成全新的公開及祕密金鑰,可使用下列指令
生成祕密金鑰後,再生成相應的公開金鑰
之後就會生成兩把金鑰分別在 public.pem
及 private.pem
。