產生 JWT 政策

本頁內容適用於 ApigeeApigee Hybrid

查看 Apigee Edge 說明文件。

政策圖示

結果

產生已簽署或加密的 JWT,並提供可設定的聲明集。 然後,JWT 可以傳回給用戶端、傳輸至後端目標,或以其他方式使用。如需詳細簡介,請參閱 JWS 和 JWT 政策總覽

這項政策是可擴充政策,使用這項政策可能會產生費用或影響用量,具體情況取決於您的 Apigee 授權。如要瞭解政策類型和使用方式的影響,請參閱「政策類型」。

做法

政策是否產生已簽署或加密的 JWT,取決於您用來指定產生 JWT 的演算法的元素:

影片

觀看短片,瞭解如何產生已簽署的 JWT。

產生已簽署的 JWT

本節說明如何產生已簽署的 JWT。如為已簽署的 JWT,請使用 <Algorithm> 元素指定金鑰簽署演算法。

已簽署 JWT 的範例

下列範例說明如何產生已簽署的 JWT。

HS256 演算法

這個範例政策會產生新的 JWT,並使用 HS256 演算法簽署。HS256 簽署和驗證簽章時,都必須使用共用密鑰。

觸發這項政策動作時,Apigee 會編碼 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."
}

iatexpjti 聲明的值會有所不同。

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 公開金鑰。

  • ECDH-ES
  • ECDH-ES+A128KW
  • ECDH-ES+A192KW
  • ECDH-ES+A256KW
<PublicKey>
  <Value ref="ec_publickey"/>
</PublicKey>

注意:金鑰必須解析為橢圓曲線公開金鑰。

  • A128KW
  • A192KW
  • A256KW
  • A128GCMKW
  • A192GCMKW
  • A256GCMKW
<SecretKey>
  <Id>optional key identifier here</Id>
  <Value ref="private.secretkey"/>
</SecretKey>
  • PBES2-HS256+A128KW
  • PBES2-HS384+A192KW
  • PBES2-HS512+A256KW
<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 使用者介面會強制執行其他限制,例如自動移除非英數字元。

(選用) 使用 <displayname></displayname> 元素,在 Apigee UI 代理程式編輯器中,以其他自然語言名稱標示政策。

不適用 必填
continueOnError 設為 false,以便在政策失敗時傳回錯誤。這是大多數政策的預期行為。

設為 true,即使政策失敗,流程執行作業仍會繼續。

false 選用
已啟用 設為 true 即可強制執行政策。

設為 false 即可「關閉」這項政策。即使政策仍附加至流程,系統也不會強制執行。

選用
非同步 這項屬性已淘汰。 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>
</Algorithm>

指定金鑰和內容加密的加密演算法。使用 <Algorithms> 元素產生加密的 JWT。

預設 不適用
(選用) 請提供 <Algorithm><Algorithms> 必填
類型 字串

<Algorithms> 的子元素

下表提供 <Algorithms> 子元素的高階說明:

子元素 是否必要 說明
<Key> 必填 指定金鑰的加密演算法。
<Content> 必填 指定內容的加密演算法。

金鑰加密演算法

下表列出可用的金鑰加密演算法。

<Key> 的值 (金鑰加密演算法) 必須提供索引鍵元素
dir <DirectKey>
RSA-OAEP-256 <PublicKey> (必須解析為 RSA 公開金鑰)
  • A128KW
  • A192KW
  • A256KW
  • A128GCMKW
  • A192GCMKW
  • A256GCMKW
<SecretKey>
  • PBES2-HS256+A128KW
  • PBES2-HS384+A192KW
  • PBES2-HS512+A256KW
<PasswordKey>
  • ECDH-ES
  • ECDH-ES+A128KW
  • ECDH-ES+A192KW
  • ECDH-ES+A256KW
<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
外觀狀態 選用
類型 整數
有效值

值或含有該值的流程變數參照。時間單位可指定如下:

  • ms = 毫秒 (預設)
  • s = 秒
  • m = 分鐘
  • h = 小時
  • d = 天數

舉例來說,ExpiresIn=10d 相當於 ExpiresIn 為 864000s。

<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。值可以是任何字串。您可以將值指定為常值文字值,也可以透過變數參照間接指定,並使用 ref 屬性。

這項政策會將這個金鑰 ID 做為 kid 聲明,納入產生的 JWT 標頭中。

必填

PEM 編碼的私密金鑰。指定用於簽署酬載的私密金鑰。 使用 ref 屬性並指定變數,例如 private.private-key

如果 <Algorithm> 元素包含 RSA 變體 (RS256/RS384/RS512 或 PS256/PS384/PS512),則必須提供編碼的 RSA 私密金鑰。如果 <Algorithm> 元素包含 EC 變體 (ES256/ES384/ES512 其中之一),您必須提供適當曲線的橢圓曲線私密金鑰。

密碼 選用

如果需要,政策應使用的密碼,用於解密私密金鑰。使用 ref 屬性透過流程變數傳遞密碼。

注意:您必須指定流程變數。如果政策設定以純文字指定密碼,Apigee 會拒絕這項設定,視為無效。流程變數必須以「private」為前置字元。例如:private.mypassword

<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> 的子元素

請提供 ValueCertificateJWKS 其中一個。 如果指定 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:

  • 以文字值形式:

    <PublicKey>
      <JWKS>jwks-content-here</JWKS>
      <Id ref="variable-containing-a-kid">literal-value-here</Id>
    </PublicKey>
  • 間接指定,使用 ref 屬性指定流程變數:

    <PublicKey>
      <JWKS ref="variable-containing-jwks-content"/>
      <Id ref="variable-containing-a-kid">literal-value-here</Id>
    </PublicKey>

    參照的變數應包含代表 JWKS 的字串。

  • 透過靜態 URI 間接存取,並使用 uri 屬性:

    <PublicKey>
      <JWKS uri="uri-that-returns-a-jwks"/>
      <Id ref="variable-containing-a-kid">literal-value-here</Id>
    </PublicKey>
  • 透過動態決定的 URI 間接設定,並使用 uriRef 屬性:

    <PublicKey>
      <JWKS uriRef="variable-containing-a-uri-that-returns-a-jwks"/>
      <Id ref="variable-containing-a-kid">literal-value-here</Id>
    </PublicKey>

在所有情況下,於 GenerateJWT 中指定 JWKS 元素來產生加密 JWT 時,您也必須指定 PublicKey/Id 元素。

<PublicKey>
  <JWKS uri="uri-that-returns-a-jwks"/>
  <Id ref="variable-containing-a-kid">literal-value-here</Id>
</PublicKey>
ID

代表金鑰 ID 的字串。在執行階段,Apigee 會從 JWKS 擷取具有與這個值相符的 kid 欄位的金鑰。如果您在 GenerateJWT 中使用 JWKS 元素,就必須使用 Id 元素。

<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> 的子元素和屬性:

子項 存在必要性 說明
編碼 (屬性) 選用

指定如何編碼參照變數中的金鑰。根據預設,如果沒有 encoding 屬性,系統會將鍵的編碼視為 UTF-8。這個屬性的有效值為:十六進位、base16、base64 或 base64url。 編碼值 hex 和 base16 是同義詞。

<SecretKey encoding="VALUE_HERE" >
 <Id ref="variable-containing-key-id-here">secret-key-id</Id>
 <Value ref="private.secretkey"/>
</SecretKey>

在上述範例中,如果編碼屬性為 hex,且變數 private.secretkey 的內容為 494c6f766541504973,則金鑰會解碼為一組 9 個位元組,以十六進位表示則為 49 4c 6f 76 65 41 50 49 73。反之,如果編碼屬性為 base64,且變數 private.secretkey 的內容為 VGhpcy1pcy1hLXNlY3JldA,則金鑰會解碼為一組 16 個位元組 (十六進位):54 68 69 73 2d 69 73 2d 61 2d 73 65 63 72 65 74

ID (元素) 選用

金鑰 ID。值可以是任何字串。您可以將值指定為常值文字值,也可以透過變數參照間接指定,並使用 ref 屬性。

<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 做為 kid 聲明,納入產生的 JWT 標頭中。

值 (元素) 必填

編碼後的密鑰。指定用於簽署酬載的密鑰。 使用 ref 屬性 透過變數 (例如 private.secret-key) 間接提供金鑰。

<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>,設定無效。
預設 不適用
外觀狀態 選用
類型 字串
有效值 SignedEncrypted

流程變數

產生 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> 中使用的宣稱是下列已註冊名稱之一:kidisssubaudiatexpnbfjti,則部署作業會失敗。
InvalidTypeForAdditionalClaim 如果 <AdditionalClaims> 元素子元素 <Claim> 中使用的宣稱不是 stringnumberbooleanmap 類型,則部署作業會失敗。
MissingNameForAdditionalClaim 如果在 <AdditionalClaims> 元素的子元素 <Claim> 中未指定權杖名稱,則部署作業會失敗。
InvalidNameForAdditionalHeader 如果 <AdditionalClaims> 元素的子元素 <Claim> 中使用的聲明名稱為 algtyp,就會發生此錯誤。
InvalidTypeForAdditionalHeader 如果 <AdditionalClaims> 元素子元素 <Claim> 中使用的宣稱類型不是 stringnumberbooleanmap 類型,則部署作業會失敗。
InvalidValueOfArrayAttribute 如果 <AdditionalClaims> 元素的子元素 <Claim> 中陣列屬性的值未設為 truefalse,就會發生這個錯誤。
InvalidConfigurationForActionAndAlgorithm 如果 <PrivateKey> 元素與 HS Family 演算法搭配使用,或是 <SecretKey> 元素與 RSA Family 演算法搭配使用,則部署作業會失敗。
InvalidValueForElement 如果 <Algorithm> 元素中指定的值不是支援的值,則部署作業會失敗。
MissingConfigurationElement 如果 <PrivateKey> 元素未與 RSA 系列演算法搭配使用,或 <SecretKey> 元素未與 HS 系列演算法搭配使用,就會發生這個錯誤。
InvalidKeyConfiguration 如果在 <PrivateKey><SecretKey> 元素中未定義子元素 <Value>,則部署作業會失敗。
EmptyElementForKeyConfiguration 如果 <PrivateKey><SecretKey> 元素的子元素 <Value> 的 ref 屬性為空白或未指定,部署作業就會失敗。
InvalidVariableNameForSecret 如果 <PrivateKey><SecretKey> 元素的子元素 <Value> 在 ref 屬性中指定的資料流變數名稱不含私人前置字元 (private.),就會發生這個錯誤。
InvalidSecretInConfig 如果 <PrivateKey><SecretKey> 元素的子元素 <Value> 不含私人前置字串 (private.),就會發生這個錯誤。
InvalidTimeFormat 如果 <NotBefore> 元素中指定的值未使用支援的格式,則部署作業會失敗。

錯誤變數

這些變數會在發生執行階段錯誤時設定。詳情請參閱「關於政策錯誤的相關資訊」。

變數 地點 範例
fault.name="fault_name" fault_name 是錯誤名稱,如上方「執行階段錯誤」表格所列。錯誤名稱是錯誤代碼的最後一個部分。 fault.name Matches "InvalidToken"
JWT.failed 所有 JWT 政策在失敗的情況下都會設定相同的變數。 JWT.failed = true

錯誤回應範例

JWT 政策錯誤代碼

針對錯誤處理,最佳做法是擷取錯誤回應的 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>