本頁內容適用於 Apigee 和 Apigee Hybrid。
  
    查看 
    Apigee Edge 說明文件。
  
  
       
 
  
結果
產生已簽署或加密的 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 的元素參考資料
政策參考資料說明 Generate JWT 政策的元素和屬性。
注意:設定會因使用的加密演算法而略有不同。如需特定用途的設定範例,請參閱已簽署 JWT 的範例或已加密 JWT 的範例。
適用於頂層元素的屬性
<GenerateJWT name="JWT" continueOnError="false" enabled="true" async="false">
所有政策父項元素都有下列屬性。
| 屬性 | 說明 | 預設 | 外觀狀態 | 
|---|---|---|---|
| 名稱 | 政策的內部名稱。名稱只能使用以下字元: A-Z0-9._\-$ %。不過,Apigee 使用者介面會強制執行其他限制,例如自動移除非英數字元。您也可以使用  | 不適用 | 必填 | 
| continueOnError | 設為 false,以便在政策失敗時傳回錯誤。這是大多數政策的預期行為。設為  | false | 選用 | 
| 已啟用 | 設為 true即可強制執行政策。設為  | 是 | 選用 | 
| 非同步 | 這項屬性已淘汰。 | false | 已淘汰 | 
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
除了名稱屬性之外,您還可以使用這個屬性,在 Apigee UI 代理伺服器編輯器中,以其他自然語言名稱標記政策。
| 預設 | 如果省略這個元素,系統會使用政策名稱屬性的值。 | 
| 外觀狀態 | 選用 | 
| 類型 | 字串 | 
<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>
</Algorithms>指定金鑰和內容加密的加密演算法。使用 <Algorithms> 元素產生加密的 JWT。
| 預設 | 不適用 | 
| (選用) 請提供 <Algorithm>或<Algorithms>。 | 必填 | 
| 類型 | 字串 | 
<Algorithms> 的子元素
  下表提供 <Algorithms> 子元素的高階說明:
| 子元素 | 是否必要 | 說明 | 
|---|---|---|
| <Key> | 必填 | 指定金鑰的加密演算法。 | 
| <Content> | 必填 | 指定內容的加密演算法。 | 
金鑰加密演算法
下表列出可用的金鑰加密演算法。
| <Key>的值 (金鑰加密演算法) | 必須提供索引鍵元素 | 
|---|---|
| dir | <DirectKey> | 
| RSA-OAEP-256 | <PublicKey>(必須解析為 RSA 公開金鑰) | 
| 
 | <SecretKey> | 
| 
 | <PasswordKey> | 
| 
 | <PublicKey>(必須解析為橢圓曲線公開金鑰) | 
如需金鑰加密演算法為 RSA-OAEP-256 的範例,請參閱「產生加密的 JWT」,因此您會使用 <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>
注意:目前透過 UI 新增 GenerateJWT 政策時,系統會插入 CustomClaims 元素。這個元素無法運作,因此遭到忽略。請改用 <AdditionalClaims> 元素。使用者介面會在稍後更新,插入正確的元素。
<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 可將任何無法解析的變數視為空字串 (空值)。
| 預設 | 否 | 
| 外觀狀態 | 選用 | 
| 類型 | 布林值 | 
| 有效值 | true 或 false | 
<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 | Mon, 14 Aug 2017 11:00:21 PDT | 
| RFC 850 | EEEE, dd-MMM-yy HH:mm:ss zzz | 2017 年 8 月 14 日星期一 11:00:21 PDT | 
| ANCI-C | EEE MMM d HH:mm:ss yyyy | Mon Aug 14 11:00:21 2017 | 
如為相對時間值,請指定整數和時間範圍,例如:
- 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。值可以是任何字串。您可以將值指定為常值文字值,也可以透過變數參照間接指定,並使用  這項政策會將這個金鑰 ID 做為產生的 JWT 標頭中的  | 
| 值 | 必填 | 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 元素為選用項目。指定產生簽署 JWT 時使用的私密金鑰,該 JWT 使用對稱 (HS*) 演算法;或指定產生加密 JWT 時使用的私密金鑰,該 JWT 使用對稱 (AES) 演算法進行金鑰加密。
「<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> 這項政策會將這個金鑰 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"/>
這項政策會產生含有 sub 憑證附加資訊的 JWT,並設為指定值。這項憑證附加資訊會識別 JWT 的主體,或對其做出聲明。這是 IETF RFC 7519 中提及的一組標準聲明。
| 預設 | 不適用 | 
| 外觀狀態 | 選用 | 
| 類型 | 字串 | 
| 有效值 | 任何可明確識別主體的值,或參照值的流程變數。 | 
<Type>
<Type>type-string-here</Type>
說明政策是否會產生已簽署或加密的 JWT。<Type> 元素為選用項目。您可以使用這項屬性,讓讀者瞭解政策是否會產生已簽署或加密的 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>