本頁適用於 Apigee 和 Apigee Hybrid。
查看
Apigee Edge 說明文件。
結果
產生已簽署的 JWT 或加密的 JWT,並提供可設定的陳述式集。接著,JWT 可傳回給用戶端、傳輸至後端目標,或以其他方式使用。如需詳細介紹,請參閱「JWS 和 JWT 政策總覽」。
這項政策是可擴充的政策,視您的 Apigee 授權而定,使用這項政策可能會產生費用或使用量影響。如要瞭解政策類型和使用相關性,請參閱「政策類型」。
做法
政策是否會產生已簽署或已加密的 JWT,取決於您用來指定產生 JWT 的演算法元素:
- 如果您使用
<Algorithm>
元素,政策會產生已簽署的 JWT。 - 如果您使用
<Algorithms>
元素,政策會產生加密的 JWT。
影片
觀看這部短片,瞭解如何產生已簽署的 JWT。
產生已簽署的 JWT
本節說明如何產生已簽署的 JWT。如果是已簽署的 JWT,請使用 <Algorithm>
元素指定簽署金鑰的演算法。
已簽署 JWT 的範例
下列範例說明如何產生已簽署的 JWT。
HS256 演算法
這個範例政策會產生新的 JWT,並使用 HS256 演算法簽署。HS256 會使用共用密鑰來簽署及驗證簽名。
觸發這項政策動作時,Apigee 會編碼 JWT 標頭和酬載,然後以數位方式簽署 JWT。請參閱上方的影片,瞭解完整的示例,包括如何提出政策要求。
這裡的政策設定會建立 JWT,其中包含一組 JWT 規格定義的標準宣告,包括 1 小時的到期時間,以及額外的宣告。您可以視需要加入任意數量的額外聲明。如要進一步瞭解本政策範例中各個元素的規定和選項,請參閱元素參考資料。
<GenerateJWT name="JWT-Generate-HS256"> <DisplayName>JWT Generate HS256</DisplayName> <Type>Signed</Type> <Algorithm>HS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <SecretKey> <Value ref="private.secretkey"/> <Id>1918290</Id> </SecretKey> <ExpiresIn>1h</ExpiresIn> <Subject>monty-pythons-flying-circus</Subject> <Issuer>urn://apigee-JWT-policy-test</Issuer> <Audience>fans</Audience> <Id/> <AdditionalClaims> <Claim name="show">And now for something completely different.</Claim> </AdditionalClaims> <OutputVariable>jwt-variable</OutputVariable> </GenerateJWT>
產生的 JWT 會包含以下標頭…
{ "typ" : "JWT", "alg" : "HS256", "kid" : "1918290" }
… 並且酬載內容會類似以下內容:
{ "sub" : "monty-pythons-flying-circus", "iss" : "urn://apigee-JWT-policy-test", "aud" : "fans", "iat" : 1506553019, "exp" : 1506556619, "jti" : "BD1FF263-3D25-4593-A685-5EC1326E1F37", "show": "And now for something completely different." }
iat、exp 和 jti 憑證的值會有所不同。
RS256 演算法
這個範例政策會產生新的 JWT,並使用 RS256 演算法簽署。產生 RS256 簽名需要使用 RSA 私密金鑰,且該金鑰必須以 PEM 編碼格式提供,並且可能會經過密碼加密。請參閱上方的影片,瞭解完整的示例,包括如何提出政策要求。
觸發這項政策動作時,Apigee 會對 JWT 進行編碼並以數位方式簽署,包括憑證附加資訊。如要瞭解 JWT 的各個部分,以及如何加密和簽署,請參閱 RFC7519。
<GenerateJWT name="JWT-Generate-RS256"> <Type>Signed</Type> <Algorithm>RS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <PrivateKey> <Value ref="private.privatekey"/> <Password ref="private.privatekey-password"/> <Id ref="private.privatekey-id"/> </PrivateKey> <Subject>apigee-seattle-hatrack-montage</Subject> <Issuer>urn://apigee-JWT-policy-test</Issuer> <Audience>urn://c60511c0-12a2-473c-80fd-42528eb65a6a</Audience> <ExpiresIn>60m</ExpiresIn> <Id/> <AdditionalClaims> <Claim name="show">And now for something completely different.</Claim> </AdditionalClaims> <OutputVariable>jwt-variable</OutputVariable> </GenerateJWT>
上述範例使用 <Algorithm>
元素,因此會產生已簽署的 JWT。<PrivateKey>
元素會指定用來簽署 JWT 的加密編譯金鑰。還有其他重要元素。您使用的演算法取決於 <Algorithm>
的值所指定的演算法,詳情請參閱下一節。
設定已簽署 JWT 的關鍵元素
請使用下列其中一個元素,指定用於產生已簽署 JWT 的金鑰:
您使用的元素取決於所選演算法,如以下表所示:
演算法 | 重要元素 |
---|---|
HS{256/384/512}* | <SecretKey> <Value ref="private.secretkey"/> <Id ref="secretkey-id">key-1918290</Id> </SecretKey> |
RS/PS/ES{256/384/512}* | <PrivateKey> <Value ref="private.privatekey"/> <Password ref="private.privatekey-password"/> <Id ref="privatekey-id">key-1918290</Id> </PrivateKey> |
在上述範例中,<Password>
和 <Id>
元素為選用項目。
如要進一步瞭解關鍵要求,請參閱「關於簽名加密演算法」一文。
產生加密的 JWT
本節說明如何產生加密的 JWT。針對已加密的 JWT,請使用 <Algorithms>
元素指定簽署金鑰和內容的演算法。
加密 JWT 的範例
以下範例說明如何產生加密的 JWT。此範例使用 <Algorithms>
元素,因此會產生已加密的 JWT。
RSA-OAEP-256
在以下範例中:
- 金鑰會使用 RSA-OAEP-256 演算法加密。
- 內容會使用 A128GCM 演算法加密。
<PublicKey>
元素會指定用於金鑰加密的金鑰。
<GenerateJWT name="gjwt-1"> <Type>Encrypted</Type> <Algorithms> <Key>RSA-OAEP-256</Key> <Content>A128GCM</Content> </Algorithms> <PublicKey> <Value ref="rsa_publickey"/> </PublicKey> <Subject>subject@example.com</Subject> <Issuer>urn://apigee</Issuer> <ExpiresIn>1h</ExpiresIn> <AdditionalHeaders> <Claim name="moniker">Harvey</Claim> </AdditionalHeaders> <OutputVariable>output_var</OutputVariable> </GenerateJWT>
A128KW
在以下範例中:
- 金鑰會使用 A128KW 演算法進行加密。
- 內容會使用 A128GCM 演算法加密。
<SecretKey>
元素會指定用於金鑰加密的金鑰。
<GenerateJWT name='gjwt-2'> <Algorithms> <Key>A128KW</Key> <Content>A128GCM</Content> </Algorithms> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <SecretKey> <Value ref='private.secretkey'/> </SecretKey> <Subject>subject@example.com</Subject> <Issuer>urn://apigee</Issuer> <ExpiresIn>1h</ExpiresIn> <OutputVariable>output_var</OutputVariable> </GenerateJWT>
設定加密 JWT 的關鍵元素
如要產生加密的 JWT,請使用下列其中一個元素指定 GenerateJWT 的加密金鑰:
您使用的元素取決於所選的金鑰加密演算法,如以下表所示:
金鑰加密演算法 | 重要元素 |
---|---|
RSA-OAEP-256 | <PublicKey> <Value ref="rsa_publickey"/> </PublicKey> 注意:金鑰必須解析為 RSA 公開金鑰。 |
|
<PublicKey> <Value ref="ec_publickey"/> </PublicKey> 注意:金鑰必須解析為橢圓曲線公開金鑰。 |
|
<SecretKey> <Id>optional key identifier here</Id> <Value ref="private.secretkey"/> </SecretKey> |
|
<PasswordKey> <Id>optional key identifier here</Id> <Value ref="private.passwordkey"/> <SaltLength> <PBKDF2Iterations> </PasswordKey> |
dir | <DirectKey> <Id>optional key identifier here</Id> <Value encoding="base16|hex|base64|base64url" ref="private.directkey"/> </DirectKey> |
如要進一步瞭解關鍵要求,請參閱「關於簽名加密演算法」一文。
產生 JWT 的元素參考資料
政策參考資料說明「產生 JWT」政策的元素和屬性。
注意:設定會因使用的加密演算法而有所不同。如需特定用途的設定範例,請參閱「已簽署 JWT 的範例」或「已加密 JWT 的範例」。
套用至頂層元素的屬性
<GenerateJWT name="JWT" continueOnError="false" enabled="true" async="false">
以下屬性適用於所有政策父元素。
屬性 | 說明 | 預設 | 在家狀態 |
---|---|---|---|
名稱 |
政策的內部名稱。您可以在名稱中使用的字元僅限:
A-Z0-9._\-$ % 。不過,Apigee UI 會強制執行其他限制,例如自動移除非英數字元的字元。您可以選擇使用 |
不適用 | 必填 |
continueOnError |
將其設為 false ,即可在政策失敗時傳回錯誤。這是大多數政策的預期行為。將其設為 |
false | 選用 |
已啟用 |
設為 true 即可強制執行政策。
將其設為 |
是 | 選用 |
非同步 | 此屬性已淘汰。 | false | 已淘汰 |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
除了使用名稱屬性,您也可以在 Apigee UI 代理程式編輯器中使用其他自然語言名稱標示政策。
預設 | 如果省略這個元素,系統會使用政策的 name 屬性值。 |
在家狀態 | 選用 |
類型 | 字串 |
<Algorithm>
<Algorithm>algorithm-here</Algorithm>
指定用來簽署權杖的加密演算法。使用 <Algorithm>
元素產生已簽署的 JWT。
預設 | 不適用 |
在家狀態 | (選用) 必須使用 <Algorithm> 或 <Algorithms> 其中之一。 |
類型 | 字串 |
有效值 | HS256、HS384、HS512、RS256、RS384、RS512、ES256、ES384、ES512、PS256、PS384、PS512 |
<Algorithms>
<Algorithms> <Key>key-algorithm</Key> <Content>content-algorithm</Content> </Algorithm>
指定金鑰和內容加密的加密演算法。使用 <Algorithms>
元素產生加密的 JWT。
預設 | 不適用 |
(選用) 必須使用 <Algorithm> 或 <Algorithms> 其中之一。 |
必填 |
類型 | 字串 |
<Algorithms>
的子元素
下表概略說明 <Algorithms>
的子元素:
子元素 | 是否必要 | 說明 |
---|---|---|
<Key> |
必填 | 指定金鑰的加密演算法。 |
<Content> |
必填 | 指定內容的加密演算法。 |
金鑰加密演算法
下表列出可用於金鑰加密的演算法。
<Key> 的值 (金鑰加密演算法) |
必要的元素 |
---|---|
dir | <DirectKey> |
RSA-OAEP-256 | <PublicKey> (必須解析為 RSA 公開金鑰) |
|
<SecretKey> |
|
<PasswordKey> |
|
<PublicKey> (必須解析為橢圓曲線公開金鑰) |
請參閱「產生已加密的 JWT」一文,瞭解金鑰加密演算法為 RSA-OAEP-256
的範例,這樣您就可以使用 <PublicKey>
元素,並將值解析為 RSA 公開金鑰。
內容加密演算法
下列演算法 (對稱式、AES 架構) 可用於內容加密:
- A128CBC-HS256
- A192CBC-HS384
- A256CBC-HS512
- A128GCM
- A192GCM
- A256GCM
如要進一步瞭解所有這些演算法,請參閱 RFC7518。
<Audience>
<Audience>audience-here</Audience> or: <Audience ref='variable_containing_audience'/>
政策會產生 JWT,其中包含將 aud 憑證附加資訊設為指定值。這個權杖附加資訊可識別 JWT 的收件者。這是 RFC7519 中提及的註冊宣告之一。
預設 | 不適用 |
在家狀態 | 選用 |
類型 | 陣列 (以半形逗號分隔的值清單) |
有效值 | 任何可識別目標對象的內容。 |
<AdditionalClaims/Claim>
<AdditionalClaims> <Claim name='claim1'>explicit-value-of-claim-here</Claim> <Claim name='claim2' ref='variable-name-here'/> <Claim name='claim3' ref='variable-name-here' type='boolean'/> </AdditionalClaims> or: <AdditionalClaims ref='claim_payload'/>
可讓您在 JWT 的酬載中指定其他憑證名稱/值組合。您可以明確將聲明指定為字串、數字、布林值、地圖或陣列。地圖只是一組名稱/值組合。
預設 | 不適用 |
在家狀態 | 選用 |
有效值 | 您要用於額外聲明的任何值。您可以明確將聲明指定為字串、數字、布林值、地圖或陣列。 |
<Claim>
元素的屬性如下:
- name - (必填) 聲明的名稱。
- ref - (選用) 流程變數的名稱。如果有此值,政策會使用這個變數的值做為宣告。如果您同時指定 ref 屬性和明確的聲明值,則明確值會是預設值,並在參照的流程變數未解析時使用。
- type - (選用) 下列任一值:字串 (預設)、數字、布林值或地圖
- array - (選用) 將此屬性設為 true,表示值是否為類型的陣列。預設值:false。
當您加入 <Claim>
元素時,系統會在您設定政策時,將聲明名稱設為靜態。您也可以傳遞 JSON 物件來指定聲明名稱。由於 JSON 物件會以變數的形式傳遞,因此產生的 JWT 中的憑證附加資訊名稱會在執行階段決定。
例如:
<AdditionalClaims ref='json_claims'/>
其中變數 json_claims
包含以下格式的 JSON 物件:
{ "sub" : "person@example.com", "iss" : "urn://secure-issuer@example.com", "non-registered-claim" : { "This-is-a-thing" : 817, "https://example.com/foobar" : { "p": 42, "q": false } } }
產生的 JWT 會納入 JSON 物件中的所有權杖。
<AdditionalHeaders/Claim>
<AdditionalHeaders> <Claim name='claim1'>explicit-value-of-claim-here</Claim> <Claim name='claim2' ref='variable-name-here'/> <Claim name='claim3' ref='variable-name-here' type='boolean'/> <Claim name='claim4' ref='variable-name' type='string' array='true'/> </AdditionalHeaders>
將額外的憑證附加資訊名稱/值組放入 JWT 的標頭中。
預設 | 不適用 |
在家狀態 | 選用 |
有效值 | 您要用於額外聲明的任何值。您可以明確將聲明指定為字串、數字、布林值、地圖或陣列。 |
<Claim>
元素的屬性如下:
- name - (必填) 聲明的名稱。
- ref - (選用) 流程變數的名稱。如果有此值,政策會使用這個變數的值做為宣告。如果您同時指定 ref 屬性和明確的聲明值,則明確值會是預設值,並在參照的流程變數未解析時使用。
- type - (選用) 下列任一值:字串 (預設)、數字、布林值或地圖
- array - (選用) 將此屬性設為 true,表示值是否為類型的陣列。預設值:false。
<Compress>
<Compress>true</Compress>
指定是否要在加密前壓縮文字。這個元素僅在產生加密的 JWT 時有效。
<CriticalHeaders>
<CriticalHeaders>a,b,c</CriticalHeaders> or: <CriticalHeaders ref=’variable_containing_headers’/>
將重要標頭 crit 新增至 JWT 標頭。crit 標頭是 JWT 接收器必須知道且辨識的標頭名稱陣列。例如:
{ "typ": "...", "alg" : "...", "crit" : [ "a", "b", "c" ], }
根據規格說明,驗證方必須檢查 crit 標頭,並驗證每個標頭是否可讀取。舉例來說,VerifyJWT 政策會檢查 crit 標頭。針對 crit 標頭中列出的每個項目,它會檢查 VerifyJWT 政策的 <KnownHeaders>
元素是否也列出該標頭。如果 VerifyJWT 政策在 crit 中找到的標頭未列於 <KnownHeaders>
中,就會導致 VerifyJWT 政策失敗。
預設 | 不適用 |
在家狀態 | 選用 |
類型 | 以半形逗號分隔的字串陣列 |
有效值 | 陣列或含有陣列的變數名稱。 |
<CustomClaims>
注意:目前,透過使用者介面新增 GenerateJWT 政策時,系統會插入 CustomClaims 元素。這個元素無法運作,因此會遭到忽略。請改用正確的元素 <AdditionalClaims>。UI 會在稍後更新,插入正確的元素。
<DirectKey>
<DirectKey> <Id>A12345</Id> <Value encoding="base16|hex|base64|base64url" ref="private.directkey"/> </DirectKey>
指定直接金鑰,用於在加密演算法為 dir
時加密 JWT (「直接加密」)。
<DirectKey>
的子元素
下表概略說明 <DirectKey>
的子元素:
子元素 | 是否必要 | 說明 |
---|---|---|
ID | 選用 | 金鑰 ID |
值 | 必填 | 使用 ref 屬性指定變數參照。參照變數的內容必須是位元組陣列的字串編碼,並透過十六進位 (base16)、base64 或 base64url 編碼。 |
透過直接金鑰加密功能,您可以直接提供一系列位元組,做為內容加密金鑰 (CEK)。您必須將位元組陣列指定為已編碼的字串。位元組陣列的必要長度取決於所選內容加密演算法的強度。舉例來說,如果是 A256CBC-HS512,您必須提供的金鑰必須是 512 位元或 64 個位元組。
變數 private.directkey
的內容必須是經過編碼的字串,可透過十六進位 (base16)、base64 或 base64url 編碼。例如,以下是十六進位編碼的 32 位元組金鑰:
96 4b e1 71 15 71 5f 87 11 0e 13 52 4c ec 1e ba df 47 62 1a 9d 3b f5 ad d2 7b b2 35 e7 d6 17 11
十六進位編碼可接受空白字元,但不強制要求,且可接受大寫或小寫字母 (B7 與 b7 相同)。
上述內容的 base64url 編碼等價為:
lkvhcRVxX4cRDhNSTOweut9HYhqdO/Wt0nuyNefWFxE
對於 base64* 變化版本,系統不接受空格,且大小寫有差異。如果未指定編碼,政策會假設編碼為 base64。
以下說明所需的鍵長度:
內容加密演算法 | 金鑰長度規定 |
---|---|
A128CBC-HS256 | 256 位元 (32 位元組) |
A192CBC-HS384 | 384 (48) |
A256CBC-HS512 | 512 (64) |
A128GCM | 128 (16) |
A192GCM | 192 (24) |
A256GCM | 256 (32) |
注意:透過 <DirectKey>
元素提供的內容加密金鑰,必須與指定的內容加密演算法完全相同長度。對於 dir
以外的任何金鑰加密演算法,政策會產生長度正確的隨機 CEK,但對於 dir
,設定必須明確提供正確大小的金鑰。
<ExpiresIn>
<ExpiresIn>time-value-here</ExpiresIn> or: <ExpiresIn ref='time-value-here'/>
以毫秒、秒、分鐘、小時或天為單位,指定 JWT 的生命週期。請使用 XML 元素或 ref 屬性指定到期日,但不能同時使用。
預設 | N/A |
在家狀態 | 選用 |
類型 | 整數 |
有效值 |
值或含有值的流程變數參照。時間單位可指定如下:
舉例來說, |
<Id>
<Id>explicit-jti-value-here</Id> -or- <Id ref='variable-name-here'/> -or- <Id/>
產生具有特定 jti 權利要求的 JWT。如果文字值和 ref 屬性都為空白,政策就會產生包含隨機 UUID 的 jti。JWT ID (jti) 聲明是 JWT 的專屬 ID。如要進一步瞭解 jti,請參閱 RFC7519。
預設 | 不適用 |
在家狀態 | 選用 |
類型 | 字串或參照。 |
有效值 | 字串或含有 ID 的流程變數名稱。 |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
如果您希望政策在無法解析政策中指定的任何參照變數時擲回錯誤,請將此屬性設為 false。將其設為 true,即可將任何無法解析的變數視為空字串 (空值)。
預設 | 否 |
在家狀態 | 選用 |
類型 | 布林值 |
有效值 | 是或否 |
<Issuer>
<Issuer ref='variable-name-here'/> <Issuer>issuer-string-here</Issuer>
政策會產生 JWT,其中包含名稱為 iss 的憑證附加資訊,並將值設為指定的值。用於識別 JWT 核發者的憑證附加資訊。這是 RFC7519 中提到的註冊權杖集之一。
預設 | 不適用 |
在家狀態 | 選用 |
類型 | 字串或參照 |
有效值 | 不限 |
<NotBefore>
<!-- Specify an absolute time. --> <NotBefore>2017-08-14T11:00:21-07:00</NotBefore> -or- <!-- Specify a time relative to when the token is generated. --> <NotBefore>6h</NotBefore>
指定權杖生效的時間。權杖會在指定時間過後失效。您可以指定絕對時間值,也可以指定相對於產生符記的時間。
預設 | 不適用 |
在家狀態 | 選用 |
類型 | 字串 |
有效值 | 如下所示。 |
NotBefore 元素的有效時間值 (絕對時間值)
名稱 | 格式 | 示例 |
可排序 | yyyy-MM-dd'T'HH:mm:ss.SSSZ |
2017-08-14T11:00:21.269-0700 |
RFC 1123 | EEE, dd MMM yyyy HH:mm:ss zzz |
2017 年 8 月 14 日星期一 上午 11 點 00 分 21 秒 (太平洋夏令時間) |
RFC 850 | EEEE, dd-MMM-yy HH:mm:ss zzz |
2017 年 8 月 14 日星期一上午 11 點整 (太平洋夏令時間) |
ANCI-C | EEE MMM d HH:mm:ss yyyy |
2017 年 8 月 14 日星期一 11:00:21 |
如為相對時間值,請指定整數和時間範圍,例如:
- 10 秒
- 60 公尺
- 12 小時
<OutputVariable>
<OutputVariable>jwt-variable</OutputVariable>
指定要放置由這項政策產生的 JWT 的位置。根據預設,會放入資料流變數 jwt.POLICYNAME.generated_jwt
。
預設 | jwt.POLICYNAME.generated_jwt |
在家狀態 | 選用 |
類型 | 字串 (流程變數名稱) |
<PasswordKey>
<PasswordKey> <Id>abcdefg</Id> <Value ref="private.password"/> <SaltLength>8</SaltLength> <PBKDF2Iterations>10000</PBKDF2> </PasswordKey>
指定加密演算法為下列任一演算法時,用於加密 JWT 的金鑰:
- PBES2-HS256+A128KW
- PBES2-HS384+A192KW
- PBES2-HS512+A256KW
針對每個金鑰演算法,您必須透過元素 <Value ref="private.password"/>
中的變數 private.password
提供密碼,以便產生金鑰加密金鑰。
<PasswordKey>
的子元素
下表概略說明 <PasswordKey>
的子元素:
子元素 | 存在必要性 | 說明 |
---|---|---|
ID | 選用 | 金鑰 ID |
值 | 必填 | 指定用於產生金鑰加密金鑰的密碼。使用 ref 屬性並指定變數,例如 private.password 。 |
SaltLength | 選用 | 鹽長度。預設值:8 個位元組。 |
PBKDF2Iterations | 選用 | PBKDF2 疊代次數:預設值為 10000。 |
<PrivateKey>
<PrivateKey> <Id ref="privatekey-id"/> <Value ref="private.pem-encoded-privatekey"/> <Password ref="private.privatekey-password"/> </PrivateKey>
指定產生已簽署 JWT 時要使用的私密金鑰,Algorithm
是 RSA 或橢圓曲線 (EC) 變體,可選 RS256/RS384/RS512、PS256/PS384/PS512 或 ES256/ES384/ES512。
<PrivateKey>
的子元素
下表說明 <PrivateKey>
的子元素:
子元素 | 存在必要性 | 說明 |
---|---|---|
ID | 選用 | 鍵 ID。這個值可以是任何字串。您可以將值指定為常值文字值,或間接指定為變數參照,並使用 這項政策會在產生的 JWT 標頭中,將這個金鑰 ID 納入 |
值 | 必填 | PEM 編碼的私密金鑰。指定用來簽署酬載的私密金鑰。使用 如果 |
密碼 | 選用 | 政策應使用的密碼,用於解密私密金鑰 (如有需要)。使用 注意:您必須指定流程變數。如果密碼是以純文字指定,Apigee 會將政策設定拒絕為無效。流程變數必須包含「private」前置字元。例如: |
<PublicKey>
<PublicKey> <!-- specify exactly one of the following --> <Value ref="variable-containing-encoded-publickey"/> <Value>PEM encoded public key</Value> <Certificate ref="variable-containing-encoded-x509-certificate"/> <Certificate>PEM encoded X509 certificate</Certificate> <JWKS>jwks-content</JWKS> <JWKS ref="variable-containing-jwks-content"/> <JWKS uri="variable-containing-jwks-content"/> <JWKS uriRef="variable-containing-uri"/> </PublicKey>
指定產生加密 JWT 時要使用的公開金鑰,而 Key
演算法是 RSA 或橢圓曲線 (EC) 變體 - RSA-OAEP-256、ECDH-ES、ECDH-ES+A128KW、ECDH-ES+A192KW 或 ECDH-ES+A256KW。
<PublicKey>
的子元素
請提供 Value
、Certificate
或 JWKS
其中一個。如果您指定 JWKS
,就必須一併指定 Id
。下表說明 <PublicKey>
的這些子元素:
子元素 | 說明 |
---|---|
值 | PEM 編碼公開金鑰。指定政策應使用的公開金鑰,用於加密內容加密金鑰。您可以直接指定鍵,也可以間接透過變數參照來指定。 <PublicKey> <Value ref="public.publickey"/> </PublicKey> 或 <PublicKey> <Value> -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw2kPrRzcufvUNHvTH/WW 2F73IyN....your key will vary....1jC0dwUD1lHV8MfUyRXmpmnNxJHACof C5TBtXMORc+us7A2cTtC4gZV256bT4h3sIEMsDl0Joz9K9MPzVPFxa1i0RgNt06n ZmkDb/DRW5onclGzxQITBFP3S6JXd4LNESJcTp705ec1cQ9Wp2Kl+nKrKyv1E5Xx DQIDAQAB -----END PUBLIC KEY----- </Value> </PublicKey> 如果您使用 RSA-OAEP-256 演算法,則經過編碼的公開金鑰必須表示 RSA 金鑰;如果您使用 EC 演算法,則經過編碼的公開金鑰必須表示適當曲線的 EC 金鑰。 |
憑證 | PEM 編碼 X.509 憑證,包裝公開金鑰。Apigee 會從憑證中擷取公開金鑰,然後使用該金鑰加密內容加密金鑰。您可以直接指定憑證,也可以間接透過變數參照來指定。 <PublicKey> <Certificate ref="public.pem-encoded-certificate"/> </PublicKey> 或 <PublicKey> <Certificate> -----BEGIN CERTIFICATE----- MIIDqDCCApACCQCG/xVb7Yzw3zANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMC 2F73IyN....your certificate data will vary....1jC0dwUD1lHV8MfUyR VQQKDAZHb29nbGUxDzANBgNVBAsMBkFwaWdlZTEaMBgGA1UEAwwRYXBpZ2VlLmdv ... YjBaZuNUDVLGvbTSRgWG5lwm85Jar2zeCBcxFDwqyZFvVNV9SfoWF/LgVVpK54n8 rknZ17USb0ob51ckxPTENmF2DUHBzgptiw10Yw== -----END CERTIFICATE----- </Certificate> </PublicKey> 如果您使用 RSA-OAEP-256 演算法,則經過編碼的公開金鑰必須表示 RSA 金鑰;如果您使用 EC 演算法,則經過編碼的公開金鑰必須表示適當曲線的 EC 金鑰。 |
JWKS | 公開金鑰的 JWKS 來源。這會是按照 IETF RFC 7517 - JSON Web Key (JWK) 所述格式建立的金鑰清單。 您可以透過下列四種方式指定 JWKS:
無論在何種情況下,只要在 GenerateJWT 中指定 <PublicKey> <JWKS uri="uri-that-returns-a-jwks"/> <Id ref="variable-containing-a-kid">literal-value-here</Id> </PublicKey> |
ID | 代表鍵 ID 的字串。在執行階段,Apigee 會從 JWKS 中擷取鍵,該鍵的 |
<SecretKey>
<SecretKey encoding="base16|hex|base64|base64url" > <Id ref="variable-containing-key-id-here">secret-key-id</Id> <Value ref="private.variable-here"/> </SecretKey>
SecretKey 元素為選用元素。在產生使用對稱 (HS*) 演算法的已簽署 JWT 或使用對稱 (AES) 演算法進行金鑰加密的加密 JWT 時,會指定要使用的密鑰。
<SecretKey>
的子項
下表說明 <SecretKey>
的子元素和屬性:
子項 | 存在必要性 | 說明 |
---|---|---|
編碼 (屬性) | 選用 | 指定在參照變數中如何編碼金鑰。根據預設,如果沒有 <SecretKey encoding="VALUE_HERE" > <Id ref="variable-containing-key-id-here">secret-key-id</Id> <Value ref="private.secretkey"/> </SecretKey> 在上述範例中,如果編碼屬性為 |
Id (元素) | 選用 | 金鑰 ID。這個值可以是任何字串。您可以使用 <SecretKey> <Id ref="flow-variable-name-here"/> <Value ref="private.variable-here"/> </SecretKey> or <SecretKey> <Id>your-id-value-here</Id> <Value ref="private.variable-here"/> </SecretKey> 這項政策會在產生的 JWT 標頭中,將這個金鑰 ID 納入 |
值 (元素) | 必填 | 已編碼的密鑰。指定用來簽署酬載的密鑰。使用 <SecretKey> <Id ref="flow-variable-name-here"/> <Value ref="private.my-secret-variable"/> </SecretKey> Apigee 會強制執行 HS256/HS384/HS512 演算法的最低金鑰強度。HS256 的金鑰長度下限為 32 個位元組,HS384 為 48 個位元組,HS512 為 64 個位元組。使用強度較低的金鑰會導致執行階段錯誤。 |
<Subject>
<Subject>subject-string-here</Subject>
<Subject ref="flow_variable" />
例如:
<Subject ref="apigee.developer.email"/>
這項政策會產生 JWT,其中包含設定為指定值的 sub 憑證附加資訊。此憑證附加資訊會識別 JWT 的使用者主體或發出陳述式。這是 IETF RFC 7519 中提到的標準宣告集之一。
預設 | 不適用 |
在家狀態 | 選用 |
類型 | 字串 |
有效值 | 任何可明確識別主體或流程變數的值,並參照該值。 |
<Type>
<Type>type-string-here</Type>
說明政策會產生已簽署的 JWT 還是已加密的 JWT。<Type>
元素為選用元素。您可以使用它向讀者說明政策是產生已簽署的 JWT 還是已加密的 JWT。
- 如果
<Type>
元素存在:- 如果
<Type>
的值為Signed
,政策會產生已簽署的 JWT,且必須提供<Algorithm>
元素。 - 如果
<Type>
的值為Encrypted
,政策就會產生加密的 JWT,且必須提供<Algorithms>
元素。
- 如果
- 如果沒有
<Type>
元素:- 如果有
<Algorithm>
元素,政策會假設<Type>
為Signed
。 - 如果有
<Algorithms>
元素,政策會假設<Type>
是Encrypted
。
- 如果有
- 如果
<Algorithm>
或<Algorithms>
都不存在,設定就會無效。
預設 | 不適用 |
在家狀態 | 選用 |
類型 | 字串 |
有效值 | Signed 或 Encrypted |
流程變數
「產生 JWT」政策不會設定流程變數。
錯誤參考資料
本節說明這項政策觸發錯誤時,Apigee 傳回的錯誤代碼和錯誤訊息,以及 Apigee 設定的錯誤變數。如果您要開發錯誤處理錯誤規則,就必須瞭解這項資訊。如需更多資訊,請參閱「政策錯誤的相關資訊」和「處理錯誤」。
執行階段錯誤
政策執行時可能會發生這些錯誤。
錯誤代碼 | HTTP 狀態 | 發生時機 |
---|---|---|
steps.jwt.AlgorithmInTokenNotPresentInConfiguration |
401 |
驗證政策包含多個演算法時會發生。 |
steps.jwt.AlgorithmMismatch |
401 |
產生政策中指定的演算法與驗證政策中預期的演算法不符。指定的演算法必須相符。 |
steps.jwt.EncryptionFailed |
401 |
無法建立加密的 JWT,原因不明 |
steps.jwt.FailedToDecode |
401 |
政策無法解碼 JWT。JWT 可能已損毀。 |
steps.jwt.GenerationFailed |
401 |
政策無法產生 JWT。 |
steps.jwt.InsufficientKeyLength |
401 |
金鑰長度必須小於 HS256 演算法的 32 個位元組、HS386 演算法的 48 個位元組,以及 HS512 演算法的 64 個位元組。 |
steps.jwt.InvalidClaim |
401 |
缺少聲明或聲明不相符,或是缺少標頭或標頭不相符。 |
steps.jwt.InvalidConfiguration |
401 |
<Algorithm> 和 <Algorithms> 元素都存在。 |
steps.jwt.InvalidCurve |
401 |
金鑰指定的曲線不適用於橢圓曲線演算法。 |
steps.jwt.InvalidJsonFormat |
401 |
標頭或酬載中發現無效的 JSON。 |
steps.jwt.InvalidPasswordKey |
401 |
指定的鍵不符合規定。 |
steps.jwt.InvalidPrivateKey |
401 |
指定的鍵不符合規定。 |
steps.jwt.InvalidPublicKey |
401 |
指定的鍵不符合規定。 |
steps.jwt.InvalidSecretKey |
401 |
指定的鍵不符合規定。 |
steps.jwt.InvalidToken |
401 |
當 JWT 簽名驗證失敗時,就會發生此錯誤。 |
steps.jwt.JwtAudienceMismatch |
401 |
目標對象權利聲明在權杖驗證時失敗。 |
steps.jwt.JwtIssuerMismatch |
401 |
發出者權利聲明在權杖驗證時失敗。 |
steps.jwt.JwtSubjectMismatch |
401 |
主體宣告在權杖驗證時失敗。 |
steps.jwt.KeyIdMissing |
401 |
「驗證」政策會使用 JWKS 做為公開金鑰來源,但已簽署的 JWT 不會在標頭中加入 kid 屬性。 |
steps.jwt.KeyParsingFailed |
401 |
無法從指定的金鑰資訊剖析公開金鑰。 |
steps.jwt.NoAlgorithmFoundInHeader |
401 |
當 JWT 不含演算法標頭時,就會發生此錯誤。 |
steps.jwt.NoMatchingPublicKey |
401 |
驗證政策使用 JWKS 做為公開金鑰來源,但已簽署 JWT 中的 kid 並未列於 JWKS 中。 |
steps.jwt.SigningFailed |
401 |
在 GenerateJWT 中,金鑰小於 HS384 或 HS512 演算法的最小大小 |
steps.jwt.TokenExpired |
401 |
政策嘗試驗證已過期的權杖。 |
steps.jwt.TokenNotYetValid |
401 |
權杖尚未生效。 |
steps.jwt.UnhandledCriticalHeader |
401 |
crit 標頭中由「驗證 JWT」政策所找到的標頭,並未列在 KnownHeaders 中。 |
steps.jwt.UnknownException |
401 |
發生不明例外狀況。 |
steps.jwt.WrongKeyType |
401 |
指定的金鑰類型有誤。例如,如果您為橢圓曲線演算法指定 RSA 金鑰,或為 RSA 演算法指定曲線金鑰。 |
部署錯誤
部署含有這項政策的 Proxy 時,可能會發生這些錯誤。
錯誤名稱 | 原因 | 修正 |
---|---|---|
InvalidNameForAdditionalClaim |
如果 <AdditionalClaims> 元素子元素 <Claim> 中使用的宣稱是下列已註冊名稱之一:kid 、iss 、sub 、aud 、iat 、exp 、nbf 或 jti ,則部署作業會失敗。 |
build |
InvalidTypeForAdditionalClaim |
如果 <AdditionalClaims> 元素子元素 <Claim> 中使用的宣稱不是 string 、number 、boolean 或 map 類型,則部署作業會失敗。 |
build |
MissingNameForAdditionalClaim |
如果在 <AdditionalClaims> 元素的子元素 <Claim> 中未指定權杖名稱,則部署作業會失敗。 |
build |
InvalidNameForAdditionalHeader |
如果 <AdditionalClaims> 元素的子元素 <Claim> 中使用的聲明名稱為 alg 或 typ ,就會發生此錯誤。 |
build |
InvalidTypeForAdditionalHeader |
如果 <AdditionalClaims> 元素子元素 <Claim> 中使用的宣稱類型不是 string 、number 、boolean 或 map 類型,則部署作業會失敗。 |
build |
InvalidValueOfArrayAttribute |
如果 <AdditionalClaims> 元素的子元素 <Claim> 中陣列屬性的值未設為 true 或 false ,就會發生這個錯誤。 |
build |
InvalidConfigurationForActionAndAlgorithm |
如果 <PrivateKey> 元素與 HS Family 演算法搭配使用,或是 <SecretKey> 元素與 RSA Family 演算法搭配使用,則部署作業會失敗。 |
build |
InvalidValueForElement |
如果 <Algorithm> 元素中指定的值不是支援的值,則部署作業會失敗。 |
build |
MissingConfigurationElement |
如果 <PrivateKey> 元素未與 RSA 系列演算法搭配使用,或 <SecretKey> 元素未與 HS 系列演算法搭配使用,就會發生這個錯誤。 |
build |
InvalidKeyConfiguration |
如果在 <PrivateKey> 或 <SecretKey> 元素中未定義子元素 <Value> ,則部署作業會失敗。 |
build |
EmptyElementForKeyConfiguration |
如果 <PrivateKey> 或 <SecretKey> 元素的子元素 <Value> 的 ref 屬性為空白或未指定,部署作業就會失敗。 |
build |
InvalidVariableNameForSecret |
如果 <PrivateKey> 或 <SecretKey> 元素的子元素 <Value> 在 ref 屬性中指定的資料流變數名稱不含私人前置字元 (private.) ,就會發生這個錯誤。 |
build |
InvalidSecretInConfig |
如果 <PrivateKey> 或 <SecretKey> 元素的子元素 <Value> 不含私人前置字串 (private.) ,就會發生這個錯誤。 |
build |
InvalidTimeFormat |
如果 <NotBefore> 元素中指定的值未使用支援的格式,則部署作業會失敗。 |
build |
錯誤變數
這些變數會在發生執行階段錯誤時設定。詳情請參閱「關於政策錯誤的相關資訊」。
變數 | 地點 | 範例 |
---|---|---|
fault.name="fault_name" |
fault_name 是錯誤名稱,如上方「執行階段錯誤」表格所列。錯誤名稱是錯誤代碼的最後一個部分。 | fault.name Matches "InvalidToken" |
JWT.failed |
所有 JWT 政策在失敗的情況下都會設定相同的變數。 | JWT.failed = true |
錯誤回應範例
針對錯誤處理,最佳做法是擷取錯誤回應的 errorcode
部分。請勿依賴 faultstring
中的文字,因為該文字可能會變更。
錯誤規則範例
<FaultRules> <FaultRule name="JWT Policy Errors"> <Step> <Name>JavaScript-1</Name> <Condition>(fault.name Matches "InvalidToken")</Condition> </Step> <Condition>JWT.failed=true</Condition> </FaultRule> </FaultRules>