Criterio GenerateJWT

Questa pagina si applica ad Apigee e Apigee hybrid.

Visualizza la documentazione di Apigee Edge.

icona delle norme

Cosa

Genera un JWT firmato o un JWT criptato, con un insieme configurabile di rivendicazioni. Il JWT può quindi essere restituito ai client, trasmesso ai target di backend o utilizzato in altri modi. Per un'introduzione dettagliata, consulta la panoramica dei criteri JWS e JWT.

Queste norme sono estensibili e il loro utilizzo potrebbe avere implicazioni in termini di costi o di utilizzo, a seconda della licenza Apigee. Per informazioni sui tipi di criteri e sulle implicazioni di utilizzo, consulta Tipi di criteri.

Come

Se la policy genera un JWT firmato o criptato dipende dall'elemento utilizzato per specificare l'algoritmo che genera il JWT:

Video

Guarda un breve video per scoprire come generare un JWT firmato.

Generare un JWT firmato

Questa sezione spiega come generare un JWT firmato. Per un JWT firmato, utilizza l'elemento <Algorithm> per specificare l'algoritmo per la firma della chiave.

Esempi di un JWT firmato

Gli esempi riportati di seguito illustrano come generare un JWT firmato.

Algoritmo HS256

Questo esempio di policy genera un nuovo JWT e lo firma utilizzando l'algoritmo HS256. HS256 si basa su un secret condiviso sia per la firma che per la verifica della firma.

Quando viene attivata questa azione della policy, Apigee codifica l'intestazione e il payload del JWT, quindi firma digitalmente il JWT. Guarda il video riportato sopra per un esempio completo, incluso come presentare una richiesta relativa alla norma.

La configurazione delle norme qui creerà un JWT con un insieme di attestazioni standard come definito dalla specifica JWT, inclusa una scadenza di 1 ora, nonché un'attestazione aggiuntiva. Puoi includere tutte le rivendicazioni aggiuntive che vuoi. Per informazioni dettagliate sui requisiti e sulle opzioni per ogni elemento di queste norme di esempio, consulta la sezione Riferimento agli elementi.

<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>

Il JWT risultante avrà questa intestazione…

{
  "typ" : "JWT",
  "alg" : "HS256",
  "kid" : "1918290"
}

… e avrà un payload con contenuti simili a questi:

{
  "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."
}

I valori delle rivendicazioni iat, exp e jti varieranno.

Algoritmo RS256

Questa norma di esempio genera un nuovo JWT e lo firma utilizzando l'algoritmo RS256. La generazione di una firma RS256 si basa su una chiave privata RSA, che deve essere fornita in formato con codifica PEM e che può essere criptata con password. Guarda il video riportato sopra per un esempio completo, incluso come presentare una richiesta relativa alla norma.

Quando viene attivata questa azione della policy, Apigee codifica e firma digitalmente il JWT, incluse le rivendicazioni. Per informazioni sulle parti di un JWT e su come vengono criptate e firmate, consulta 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>

Gli esempi riportati sopra utilizzano l'elemento <Algorithm>, pertanto generano un JWT firmato. L'elemento <PrivateKey> specifica la chiave di crittografia utilizzata per firmare il JWT. Esistono anche altri elementi chiave. Quello che utilizzi dipende dall'algoritmo specificato dal valore di <Algorithm>, come descritto nella sezione successiva.

Impostare gli elementi chiave per un JWT firmato

Utilizza esattamente uno dei seguenti elementi per specificare la chiave utilizzata per generare un JWT firmato:

L'elemento che utilizzi dipende dall'algoritmo scelto, come mostrato nella tabella seguente:

Algoritmo Elementi chiave
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>

Negli esempi precedenti, gli elementi <Password> e <Id> sono facoltativi.

Per saperne di più sui requisiti delle chiavi, consulta la sezione Informazioni sugli algoritmi di crittografia della firma.

Generare un JWT criptato

Questa sezione spiega come generare un JWT criptato. Per un JWT criptato, utilizza l'elemento <Algorithms> per specificare gli algoritmi per la firma della chiave e dei contenuti.

Esempio di JWT criptato

Il seguente esempio mostra come generare un JWT criptato. L'esempio utilizza l'elemento <Algorithms>, quindi genera un JWT criptato.

RSA-OAEP-256

Nell'esempio seguente:

  • La chiave è criptata con l'algoritmo RSA-OAEP-256.
  • I contenuti sono criptati con l'algoritmo A128GCM.

L'elemento <PublicKey> specifica la chiave utilizzata per la crittografia della chiave.

<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

Nell'esempio seguente:

  • La chiave è criptata con l'algoritmo A128KW.
  • I contenuti sono criptati con l'algoritmo A128GCM.

L'elemento <SecretKey> specifica la chiave utilizzata per la crittografia della chiave.

<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>

Impostazione degli elementi chiave per un JWT criptato

Utilizza esattamente uno dei seguenti elementi per specificare la chiave di crittografia per GenerateJWT, quando vuoi generare un JWT criptato:

L'elemento da utilizzare dipende dall'algoritmo di crittografia delle chiavi scelto, come mostrato nella seguente tabella:

Algoritmo di crittografia della chiave Elementi chiave
RSA-OAEP-256
<PublicKey>
  <Value ref="rsa_publickey"/>
</PublicKey>

Nota:la chiave deve essere risolta in una chiave pubblica RSA.

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

Nota: la chiave deve essere risolta in una chiave pubblica a curva ellittica.

  • 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>

Per saperne di più sui requisiti delle chiavi, consulta Informazioni sugli algoritmi di crittografia della firma.

Riferimento all'elemento per Genera JWT

Il riferimento ai criteri descrive gli elementi e gli attributi dei criteri Generate JWT.

Nota:la configurazione varia leggermente a seconda dell'algoritmo di crittografia utilizzato. Consulta Esempi di JWT firmato o Esempio di JWT criptato per esempi che mostrano configurazioni per casi d'uso specifici.

Attributi che si applicano all'elemento di primo livello

<GenerateJWT name="JWT" continueOnError="false" enabled="true" async="false">

I seguenti attributi sono comuni a tutti gli elementi principali dei criteri.

Attributo Descrizione Predefinito Presenza
nome Il nome interno del criterio. I caratteri che puoi utilizzare nel nome sono limitati a: A-Z0-9._\-$ %. Tuttavia, la UI di Apigee applica ulteriori limitazioni, ad esempio la rimozione automatica dei caratteri non alfanumerici.

(Facoltativo) Utilizza l'elemento <displayname></displayname> per etichettare il criterio nell'editor proxy dell'interfaccia utente Apigee con un nome diverso in linguaggio naturale.

N/D Obbligatorio
continueOnError Imposta questo valore su false per restituire un errore quando un criterio non viene rispettato. Questo è il comportamento previsto per la maggior parte delle norme.

Imposta su true per continuare l'esecuzione del flusso anche dopo l'esito negativo di un criterio.

falso Facoltativo
abilitato Imposta true per applicare la policy.

Imposta false per "disattivare" la policy. Il criterio non verrà applicato anche se rimane collegato a un flusso.

true Facoltativo
asinc Questo attributo è stato ritirato. falso Ritirato

<DisplayName>

<DisplayName>Policy Display Name</DisplayName>

Utilizza questo attributo in aggiunta all'attributo name per etichettare il criterio nell'editor proxy dell'interfaccia utente Apigee con un nome diverso in linguaggio naturale.

Predefinito Se ometti questo elemento, viene utilizzato il valore dell'attributo name del criterio.
Presenza Facoltativo
Tipo Stringa

<Algorithm>

<Algorithm>algorithm-here</Algorithm>

Specifica l'algoritmo crittografico utilizzato per firmare il token. Utilizza l'elemento <Algorithm> per generare un JWT firmato.

Predefinito N/D
Presenza (Facoltativo) È obbligatorio specificare <Algorithm> o <Algorithms>.
Tipo Stringa
Valori validi HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512

<Algorithms>

<Algorithms>
    <Key>key-algorithm</Key>
    <Content>content-algorithm</Content>
</Algorithms>

Specifica gli algoritmi crittografici per la crittografia della chiave e dei contenuti. Utilizza l'elemento <Algorithms> per generare un JWT criptato.

Predefinito N/D
(Facoltativo) È obbligatorio specificare <Algorithm> o <Algorithms>. Obbligatorio
Tipo Stringa

Elementi secondari di <Algorithms>

La tabella seguente fornisce una descrizione generale degli elementi secondari di <Algorithms>:

Elemento secondario Obbligatorio? Descrizione
<Key> Obbligatorio Specifica l'algoritmo di crittografia per la chiave.
<Content> Obbligatorio Specifica l'algoritmo di crittografia per i contenuti.

Algoritmi di crittografia delle chiavi

La tabella seguente elenca gli algoritmi disponibili per la crittografia delle chiavi.

Valore di <Key> (algoritmo di crittografia della chiave) Elemento chiave obbligatorio
dir <DirectKey>
RSA-OAEP-256 <PublicKey> (che deve essere risolto in una chiave pubblica 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> (che deve essere risolto in una chiave pubblica basata su curva ellittica)

Consulta Generare un JWT criptato per un esempio in cui l'algoritmo di crittografia della chiave è RSA-OAEP-256, quindi utilizzi l'elemento <PublicKey> con valore che si risolve in una chiave pubblica RSA.

Algoritmi di crittografia dei contenuti

Per la crittografia dei contenuti sono disponibili i seguenti algoritmi (simmetrici, basati su AES):

  • A128CBC-HS256
  • A192CBC-HS384
  • A256CBC-HS512
  • A128GCM
  • A192GCM
  • A256GCM

Per ulteriori informazioni su tutti questi algoritmi, consulta RFC7518.

<Audience>

<Audience>audience-here</Audience>

or:

<Audience ref='variable_containing_audience'/>

Il criterio genera un JWT contenente un'attestazione aud impostata sul valore specificato. Questa rivendicazione identifica i destinatari a cui è destinato il JWT. Si tratta di una delle rivendicazioni registrate menzionate nella RFC7519.

Predefinito N/D
Presenza Facoltativo
Tipo Array (un elenco di valori separati da virgole)
Valori validi Qualsiasi elemento che identifichi il pubblico.

<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'/>

Consente di specificare una o più coppie nome/valore di rivendicazione aggiuntive nel payload del JWT. Puoi specificare l'attestazione in modo esplicito come stringa, numero, valore booleano, mappa o array. Una mappa è semplicemente un insieme di coppie nome/valore.

Predefinito N/D
Presenza Facoltativo
Valori validi Qualsiasi valore che vuoi utilizzare per un'ulteriore rivendicazione. Puoi specificare l'attestazione in modo esplicito come stringa, numero, valore booleano, mappa o array.

L'elemento <Claim> prevede i seguenti attributi:

  • name: (obbligatorio) il nome della richiesta.
  • ref: (facoltativo) il nome di una variabile di flusso. Se presente, il criterio utilizzerà il valore di questa variabile come rivendicazione. Se vengono specificati sia un attributo ref sia un valore di rivendicazione esplicito, il valore esplicito è quello predefinito e viene utilizzato se la variabile di flusso a cui viene fatto riferimento non viene risolta.
  • type: (facoltativo) uno dei seguenti valori: stringa (impostazione predefinita), numero, booleano o mappa
  • array: (facoltativo) imposta su true per indicare se il valore è un array di tipi. Valore predefinito: false.

Quando includi l'elemento <Claim>, i nomi delle rivendicazioni vengono impostati in modo statico quando configuri la norma. In alternativa, puoi passare un oggetto JSON per specificare i nomi delle rivendicazioni. Poiché l'oggetto JSON viene passato come variabile, i nomi delle attestazioni nel JWT generato vengono determinati in fase di runtime.

Ad esempio:

<AdditionalClaims ref='json_claims'/>

Dove la variabile json_claims contiene un oggetto JSON nel formato:

{
  "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 }
  }
}

Il JWT generato include tutte le rivendicazioni nell'oggetto 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>

Inserisce le coppie nome/valore delle rivendicazioni aggiuntive nell'intestazione del JWT.

Predefinito N/D
Presenza Facoltativo
Valori validi Qualsiasi valore che vuoi utilizzare per un'ulteriore rivendicazione. Puoi specificare l'attestazione in modo esplicito come stringa, numero, valore booleano, mappa o array.

L'elemento <Claim> prevede i seguenti attributi:

  • name: (obbligatorio) il nome della richiesta.
  • ref: (facoltativo) il nome di una variabile di flusso. Se presente, il criterio utilizzerà il valore di questa variabile come rivendicazione. Se vengono specificati sia un attributo ref sia un valore di rivendicazione esplicito, il valore esplicito è quello predefinito e viene utilizzato se la variabile di flusso a cui viene fatto riferimento non viene risolta.
  • type: (facoltativo) uno dei seguenti valori: stringa (impostazione predefinita), numero, booleano o mappa
  • array: (facoltativo) imposta su true per indicare se il valore è un array di tipi. Valore predefinito: false.

<Compress>

<Compress>true</Compress>

Specifica se il testo viene compresso prima della crittografia. Questo elemento è valido solo quando viene generato un JWT criptato.

<CriticalHeaders>

<CriticalHeaders>a,b,c</CriticalHeaders>

or:

<CriticalHeaders ref=variable_containing_headers/>

Aggiunge l'intestazione critica crit all'intestazione JWT. L'intestazione crit è un array di nomi di intestazioni che devono essere noti e riconosciuti dal destinatario del JWT. Ad esempio:

{
  "typ": "...",
  "alg" : "...",
  "crit" : [ "a", "b", "c" ],
}

Secondo la specifica, le parti che eseguono la verifica devono esaminare l'intestazione crit e verificare che ciascuna di queste intestazioni sia compresa. Ad esempio, le norme VerifyJWT esaminano l'intestazione crit. Per ogni elemento elencato nell'intestazione crit, verifica che anche l'elemento <KnownHeaders> del criterio VerifyJWT elenchi l'intestazione. Qualsiasi intestazione trovata dal criterio VerifyJWT in crit che non è elencata anche in <KnownHeaders> causa l'errore del criterio VerifyJWT.

Predefinito N/D
Presenza Facoltativo
Tipo Array di stringhe separate da virgole
Valori validi Un array o il nome di una variabile contenente l'array.

<CustomClaims>

Nota:al momento, viene inserito un elemento CustomClaims quando aggiungi un nuovo criterio GenerateJWT tramite la UI. Questo elemento non è funzionale e viene ignorato. L'elemento corretto da utilizzare è <AdditionalClaims>. L'interfaccia utente verrà aggiornata in un secondo momento per inserire gli elementi corretti.

<DirectKey>

<DirectKey>
  <Id>A12345</Id>
  <Value encoding="base16|hex|base64|base64url" ref="private.directkey"/>
</DirectKey>

Specifica una chiave diretta per la crittografia di un JWT quando l'algoritmo di crittografia è dir ("crittografia diretta").

Elementi secondari di <DirectKey>

La tabella seguente fornisce una descrizione generale degli elementi secondari di <DirectKey>:

Elemento secondario Obbligatorio? Descrizione
ID Facoltativo Identificatore chiave
Valore Obbligatorio Specifica un riferimento a una variabile con l'attributo ref. I contenuti della variabile a cui viene fatto riferimento devono essere una codifica di stringa di un array di byte, codificata tramite esadecimale (base16), base64 o base64url.

Con la crittografia diretta delle chiavi, puoi fornire direttamente una serie di byte che fungeranno da chiave di crittografia dei contenuti (CEK). Devi specificare l'array di byte come stringa codificata. La lunghezza richiesta dell'array di byte dipende dalla solidità dell'algoritmo di crittografia dei contenuti selezionato. Ad esempio, per A256CBC-HS512, devi fornire una chiave di esattamente 512 bit o 64 byte.

I contenuti della variabile private.directkey devono essere una stringa codificata, tramite esadecimale (base16), base64 o base64url. Ad esempio, ecco una chiave di 32 byte con codifica esadecimale:

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

Per la codifica esadecimale, lo spazio vuoto è accettato ma non obbligatorio e sono accettate lettere maiuscole o minuscole (B7 è uguale a b7).

L'equivalente con codifica base64url di quanto sopra è:

lkvhcRVxX4cRDhNSTOweut9HYhqdO/Wt0nuyNefWFxE

Per le varianti base64*, gli spazi vuoti non sono accettati e le maiuscole e minuscole sono importanti. Se non specifichi una codifica, il criterio presuppone che la codifica sia base64.

Di seguito è descritta la lunghezza delle chiavi richieste:

Algoritmo di crittografia dei contenuti Requisito di lunghezza della chiave
A128CBC-HS256 256 bit (32 byte)
A192CBC-HS384 384 (48)
A256CBC-HS512 512 (64)
A128GCM 128 (16)
A192GCM 192 (24)
A256GCM 256 (32)

Nota:la chiave di crittografia dei contenuti fornita tramite l'elemento <DirectKey> deve avere la lunghezza esatta per l'algoritmo di crittografia dei contenuti specificato. Per qualsiasi algoritmo di crittografia delle chiavi diverso da dir, il criterio genera una CEK casuale della lunghezza corretta, ma per dir la configurazione deve fornire una chiave della dimensione corretta in modo esplicito.

<ExpiresIn>

<ExpiresIn>time-value-here</ExpiresIn>

or:

<ExpiresIn ref='time-value-here'/>

Specifica la durata del JWT in millisecondi, secondi, minuti, ore o giorni. Specifica la scadenza utilizzando l'elemento XML o l'attributo ref, ma non entrambi.

Predefinito N/A
Presenza Facoltativo
Tipo Numero intero
Valori validi

Un valore o un riferimento a una variabile di flusso contenente il valore. Le unità di tempo possono essere specificate come segue:

  • ms = millisecondi (valore predefinito)
  • s = secondi
  • m = minuti
  • h = ore
  • d = giorni

Ad esempio, un ExpiresIn=10d equivale a un ExpiresIn di 864000 s.

<Id>

<Id>explicit-jti-value-here</Id>
 -or-
<Id ref='variable-name-here'/>
 -or-
<Id/>

Genera un JWT con l'attestazione jti specifica. Quando il valore di testo e l'attributo ref sono entrambi vuoti, il criterio genererà un jti contenente un UUID casuale. L'attestazione JWT ID (jti) è un identificatore univoco per il JWT. Per ulteriori informazioni su jti, consulta RFC7519.

Predefinito N/D
Presenza Facoltativo
Tipo Stringa o riferimento.
Valori validi Una stringa o il nome di una variabile di flusso contenente l'ID.

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

Imposta su false se vuoi che la policy generi un errore quando qualsiasi variabile a cui viene fatto riferimento specificata nella policy non è risolvibile. Imposta su true per considerare qualsiasi variabile non risolvibile come una stringa vuota (null).

Predefinito Falso
Presenza Facoltativo
Tipo Booleano
Valori validi vero o falso

<Issuer>

<Issuer ref='variable-name-here'/>
<Issuer>issuer-string-here</Issuer>

La policy genera un JWT contenente un'attestazione con il nome iss,con un valore impostato sul valore specificato. Un'asserzione che identifica l'emittente del JWT. Si tratta di uno dei set di rivendicazioni registrati menzionati nella RFC7519.

Predefinito N/D
Presenza Facoltativo
Tipo Stringa o riferimento
Valori validi Qualsiasi

<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>

Specifica l'ora in cui il token diventa valido. Il token non è valido fino all'ora specificata. Puoi specificare un valore temporale assoluto o un tempo relativo al momento della generazione del token.

Predefinito N/D
Presenza Facoltativo
Tipo Stringa
Valori validi Vedi sotto.

Valori temporali validi per l'elemento NotBefore per i valori temporali assoluti

Nome Formato Esempio
ordinabile 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 Lun, 14 ago 2017 11:00:21 PDT
RFC 850 EEEE, dd-MMM-yy HH:mm:ss zzz Lunedì 14 agosto 2017 11:00:21 PDT
ANCI-C EEE MMM d HH:mm:ss yyyy Lun 14 ago 11:00:21 2017

Per i valori di tempo relativi, specifica un numero intero e un periodo di tempo, ad esempio:

  • 10 sec
  • 60 min
  • 12 ore

<OutputVariable>

<OutputVariable>jwt-variable</OutputVariable>

Specifica dove inserire il JWT generato da questa policy. Per impostazione predefinita, viene inserito nella variabile di flusso jwt.POLICYNAME.generated_jwt.

Predefinito jwt.POLICYNAME.generated_jwt
Presenza Facoltativo
Tipo Stringa (nome di una variabile di flusso)

<PasswordKey>

<PasswordKey>
  <Id>abcdefg</Id>
  <Value ref="private.password"/>
  <SaltLength>8</SaltLength>
  <PBKDF2Iterations>10000</PBKDF2>
</PasswordKey>

Specifica una chiave per criptare un JWT quando l'algoritmo di crittografia è uno dei seguenti:

  • PBES2-HS256+A128KW
  • PBES2-HS384+A192KW
  • PBES2-HS512+A256KW

Per ciascuno di questi algoritmi di chiave, devi fornire una password da cui viene derivata la chiave di crittografia della chiave tramite la variabile private.password nell'elemento <Value ref="private.password"/>.

Elementi secondari di <PasswordKey>

La tabella seguente fornisce una descrizione generale degli elementi secondari di <PasswordKey>:

Elemento secondario Presenza Descrizione
ID Facoltativo Identificatore chiave
Valore Obbligatorio Specifica la password utilizzata per generare la chiave di crittografia della chiave. Utilizza un attributo ref e specifica una variabile, ad esempio private.password .
SaltLength Facoltativo Lunghezza del sale. Valore predefinito: 8 byte.
PBKDF2Iterations Facoltativo Conteggio iterazioni PBKDF2: valore predefinito: 10.000.

<PrivateKey>

<PrivateKey>
  <Id ref="privatekey-id"/>
  <Value ref="private.pem-encoded-privatekey"/>
  <Password ref="private.privatekey-password"/>
</PrivateKey>

Specifica la chiave privata da utilizzare durante la generazione di un JWT firmato e Algorithm è una variante RSA o a curva ellittica (EC), ovvero RS256/RS384/RS512, PS256/PS384/PS512 o ES256/ES384/ES512.

Elementi secondari di <PrivateKey>

La tabella seguente fornisce una descrizione degli elementi secondari di <PrivateKey>:

Elemento secondario Presenza Descrizione
ID Facoltativo

L'identificatore della chiave. Il valore può essere una qualsiasi stringa. Puoi specificare il valore come valore di testo letterale o indirettamente tramite un riferimento a una variabile con l'attributo ref.

Il criterio includerà questo identificatore di chiave come rivendicazione kid nell'intestazione del JWT generato.

Valore Obbligatorio

Una chiave privata con codifica PEM. Specifica la chiave privata utilizzata per firmare il payload. Utilizza un attributo ref e specifica una variabile, ad esempio private.private-key .

Se l'elemento <Algorithm> contiene una variante RSA, RS256/RS384/RS512 o PS256/PS384/PS512, devi fornire una chiave privata RSA codificata. Se l'elemento <Algorithm> contiene una variante EC, ES256/ES384/ES512, devi fornire una chiave privata Elliptic Curve per la curva appropriata.

Password Facoltativo

La password che la policy deve utilizzare per decriptare la chiave privata, se necessario. Utilizza l'attributo ref per trasmettere la password tramite una variabile di flusso.

Nota:devi specificare una variabile di flusso. Apigee rifiuterà come non valida una configurazione dei criteri in cui la password è specificata in testo non crittografato. La variabile di flusso deve avere il prefisso "private". Ad esempio, 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>

Specifica la chiave pubblica da utilizzare durante la generazione di un JWT criptato e l'algoritmo Key è una variante RSA o a curva ellittica (EC): RSA-OAEP-256, ECDH-ES, ECDH-ES+A128KW, ECDH-ES+A192KW o ECDH-ES+A256KW.

Elementi secondari di <PublicKey>

Fornisci esattamente uno dei seguenti valori: Value, Certificate o JWKS. Se specifichi JWKS, devi specificare anche Id. La tabella seguente fornisce una descrizione di questi elementi secondari di <PublicKey>:

Elemento secondario Descrizione
Valore

Una chiave pubblica con codifica PEM. Specifica la chiave pubblica che la policy deve utilizzare per criptare la chiave di crittografia dei contenuti. Puoi specificare la chiave letteralmente o indirettamente tramite un riferimento a una variabile.

<PublicKey>
  <Value ref="public.publickey"/>
</PublicKey>

o

<PublicKey>
  <Value>
   -----BEGIN PUBLIC KEY-----
   MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw2kPrRzcufvUNHvTH/WW
   2F73IyN....your key will vary....1jC0dwUD1lHV8MfUyRXmpmnNxJHACof
   C5TBtXMORc+us7A2cTtC4gZV256bT4h3sIEMsDl0Joz9K9MPzVPFxa1i0RgNt06n
   ZmkDb/DRW5onclGzxQITBFP3S6JXd4LNESJcTp705ec1cQ9Wp2Kl+nKrKyv1E5Xx
   DQIDAQAB
   -----END PUBLIC KEY-----
  </Value>
</PublicKey>

La chiave pubblica codificata deve indicare una chiave RSA se utilizzi l'algoritmo RSA-OAEP-256 o una chiave EC della curva appropriata se utilizzi un algoritmo EC.

Certificato

Un certificato X.509 con codifica PEM che contiene una chiave pubblica. Apigee estrarrà la chiave pubblica dal certificato e la utilizzerà per criptare la chiave di crittografia dei contenuti. Puoi specificare il certificato letteralmente o indirettamente tramite un riferimento a una variabile.

<PublicKey>
 <Certificate ref="public.pem-encoded-certificate"/>
</PublicKey>

o

<PublicKey>
  <Certificate>
  -----BEGIN CERTIFICATE-----
  MIIDqDCCApACCQCG/xVb7Yzw3zANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMC
  2F73IyN....your certificate data will vary....1jC0dwUD1lHV8MfUyR
  VQQKDAZHb29nbGUxDzANBgNVBAsMBkFwaWdlZTEaMBgGA1UEAwwRYXBpZ2VlLmdv
  ...
  YjBaZuNUDVLGvbTSRgWG5lwm85Jar2zeCBcxFDwqyZFvVNV9SfoWF/LgVVpK54n8
  rknZ17USb0ob51ckxPTENmF2DUHBzgptiw10Yw==
  -----END CERTIFICATE-----
  </Certificate>
</PublicKey>

La chiave pubblica codificata deve indicare una chiave RSA se utilizzi l'algoritmo RSA-OAEP-256 o una chiave EC della curva appropriata se utilizzi un algoritmo EC.

JWKS

Una sorgente JWKS di chiavi pubbliche. Si tratta di un elenco di chiavi nel formato descritto in IETF RFC 7517 - JSON Web Key (JWK).

Puoi specificare il JWKS in uno dei quattro modi seguenti:

  • letteralmente, come valore di testo:

    <PublicKey>
      <JWKS>jwks-content-here</JWKS>
      <Id ref="variable-containing-a-kid">literal-value-here</Id>
    </PublicKey>
  • indirettamente, con l'attributo ref, specificando una variabile di flusso:

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

    La variabile a cui viene fatto riferimento deve contenere una stringa che rappresenta un JWKS.

  • indirettamente tramite un URI statico, con l'attributo uri:

    <PublicKey>
      <JWKS uri="uri-that-returns-a-jwks"/>
      <Id ref="variable-containing-a-kid">literal-value-here</Id>
    </PublicKey>
  • indirettamente tramite un URI determinato dinamicamente, con l'attributo uriRef:

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

In tutti i casi, quando specifichi un elemento JWKS all'interno di GenerateJWT per generare un JWT criptato, devi specificare anche l'elemento PublicKey/Id.

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

Una stringa che rappresenta l'identificatore della chiave. In fase di runtime, Apigee recupera una chiave dal JWKS con un campo kid che corrisponde a questo valore. L'elemento Id è obbligatorio se utilizzi l'elemento JWKS all'interno di GenerateJWT.

<SecretKey>

<SecretKey encoding="base16|hex|base64|base64url" >
 <Id ref="variable-containing-key-id-here">secret-key-id</Id>
 <Value ref="private.variable-here"/>
</SecretKey>

L'elemento SecretKey è facoltativo. Specifica la chiave segreta da utilizzare quando generi un JWT firmato che utilizza un algoritmo simmetrico (HS*) o quando generi un JWT criptato che utilizza un algoritmo simmetrico (AES) per la crittografia della chiave.

Figli di <SecretKey>

La tabella seguente fornisce una descrizione degli elementi secondari e degli attributi di <SecretKey>:

Figlio Presenza Descrizione
codifica (attributo) Facoltativo

Specifica come viene codificata la chiave nella variabile a cui viene fatto riferimento. Per impostazione predefinita, quando non è presente alcun attributo encoding, la codifica della chiave viene trattata come UTF-8. I valori validi per l'attributo sono: esadecimale, base16, base64 o base64url. I valori di codifica esadecimale e base16 sono sinonimi.

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

Nell'esempio precedente, quando l'attributo di codifica è hex e i contenuti della variabile private.secretkey sono 494c6f766541504973, la chiave verrà decodificata come un insieme di 9 byte, che in esadecimale saranno 49 4c 6f 76 65 41 50 49 73. Al contrario, quando l'attributo di codifica è base64 e i contenuti della variabile private.secretkey sono VGhpcy1pcy1hLXNlY3JldA, la chiave verrà decodificata come un insieme di 16 byte, in esadecimale: 54 68 69 73 2d 69 73 2d 61 2d 73 65 63 72 65 74.

Id (elemento) Facoltativo

L'identificatore della chiave. Il valore può essere una qualsiasi stringa. Puoi specificare il valore come valore di testo letterale o indirettamente tramite un riferimento a una variabile con l'attributo 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>

Il criterio includerà questo identificatore di chiave come rivendicazione kid nell'intestazione del JWT generato.

Valore (elemento) Obbligatorio

Una chiave segreta codificata. Specifica la chiave segreta utilizzata per firmare il payload. Utilizza l'attributo ref per fornire la chiave indirettamente tramite una variabile, ad esempio private.secret-key .

<SecretKey>
 <Id ref="flow-variable-name-here"/>
  <Value ref="private.my-secret-variable"/>
</SecretKey>

Apigee applica una lunghezza minima della chiave per gli algoritmi HS256/HS384/HS512. La lunghezza minima della chiave per HS256 è di 32 byte, per HS384 è di 48 byte e per HS512 è di 64 byte. L'utilizzo di una chiave con una potenza inferiore causa un errore di runtime.

<Subject>

<Subject>subject-string-here</Subject>
oppure
<Subject ref="flow_variable" />

Ad esempio:

<Subject ref="apigee.developer.email"/>

La policy genera un JWT contenente un'attestazione sub, impostata sul valore specificato.Questa attestazione identifica o fa un'affermazione sul soggetto del JWT. Si tratta di uno dei set standard di rivendicazioni menzionati nella RFC 7519 di IETF.

Predefinito N/D
Presenza Facoltativo
Tipo Stringa
Valori validi Qualsiasi valore che identifichi in modo univoco un soggetto o una variabile di flusso che fa riferimento a un valore.

<Type>

<Type>type-string-here</Type>

Descrive se il criterio genera un JWT firmato o un JWT criptato. L'elemento <Type> è facoltativo. Puoi utilizzarlo per informare i lettori della configurazione se il criterio genera un JWT firmato o criptato.

  • Se l'elemento <Type> è presente:
    • Se il valore di <Type> è Signed, il criterio genera un JWT firmato e l'elemento <Algorithm> deve essere presente.
    • Se il valore di <Type> è Encrypted, il criterio genererà un JWT criptato e l'elemento <Algorithms> deve essere presente.
  • Se l'elemento <Type> è assente:
    • Se è presente l'elemento <Algorithm>, il criterio presuppone che <Type> sia Signed.
    • Se è presente l'elemento <Algorithms>, il criterio presuppone che <Type> sia Encrypted.
  • Se non sono presenti né <Algorithm><Algorithms>, la configurazione non è valida.
Predefinito N/D
Presenza Facoltativo
Tipo Stringa
Valori validi Signed o Encrypted

Variabili di flusso

Il criterio Generate JWT non imposta le variabili di flusso.

Messaggi di errore

This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Occurs when
steps.jwt.AlgorithmInTokenNotPresentInConfiguration 401 Occurs when the verification policy has multiple algorithms.
steps.jwt.AlgorithmMismatch 401 The algorithm specified in the Generate policy did not match the one expected in the Verify policy. The algorithms specified must match.
steps.jwt.EncryptionFailed 401 Creation of an encrypted JWT failed for a non-specific reason
steps.jwt.FailedToDecode 401 The policy was unable to decode the JWT. The JWT is possibly corrupted.
steps.jwt.GenerationFailed 401 The policy was unable to generate the JWT.
steps.jwt.InsufficientKeyLength 401 For a key less than 32 bytes for the HS256 algorithm, less than 48 bytes for the HS386 algortithm, and less than 64 bytes for the HS512 algorithm.
steps.jwt.InvalidClaim 401 For a missing claim or claim mismatch, or a missing header or header mismatch.
steps.jwt.InvalidConfiguration 401 Both the <Algorithm> and <Algorithms> elements are present.
steps.jwt.InvalidCurve 401 The curve specified by the key is not valid for the Elliptic Curve algorithm.
steps.jwt.InvalidJsonFormat 401 Invalid JSON found in the header or payload.
steps.jwt.InvalidPasswordKey 401 The specified key specified did not meet the requirements.
steps.jwt.InvalidPrivateKey 401 The specified key specified did not meet the requirements.
steps.jwt.InvalidPublicKey 401 The specified key specified did not meet the requirements.
steps.jwt.InvalidSecretKey 401 The specified key specified did not meet the requirements.
steps.jwt.InvalidToken 401 This error occurs when the JWT signature verification fails.
steps.jwt.JwtAudienceMismatch 401 The audience claim failed on token verification.
steps.jwt.JwtIssuerMismatch 401 The issuer claim failed on token verification.
steps.jwt.JwtSubjectMismatch 401 The subject claim failed on token verification.
steps.jwt.KeyIdMissing 401 The Verify policy uses a JWKS as a source for public keys, but the signed JWT does not include a kid property in the header.
steps.jwt.KeyParsingFailed 401 The public key could not be parsed from the given key information.
steps.jwt.NoAlgorithmFoundInHeader 401 Occurs when the JWT contains no algorithm header.
steps.jwt.NoMatchingPublicKey 401 The Verify policy uses a JWKS as a source for public keys, but the kid in the signed JWT is not listed in the JWKS.
steps.jwt.SigningFailed 401 In GenerateJWT, for a key less than the minimum size for the HS384 or HS512 algorithms
steps.jwt.TokenExpired 401 The policy attempts to verify an expired token.
steps.jwt.TokenNotYetValid 401 The token is not yet valid.
steps.jwt.UnhandledCriticalHeader 401 A header found by the Verify JWT policy in the crit header is not listed in KnownHeaders.
steps.jwt.UnknownException 401 An unknown exception occurred.
steps.jwt.WrongKeyType 401 Wrong type of key specified. For example, if you specify an RSA key for an Elliptic Curve algorithm, or a curve key for an RSA algorithm.

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name Cause Fix
InvalidNameForAdditionalClaim The deployment will fail if the claim used in the child element <Claim> of the <AdditionalClaims> element is one of the following registered names: kid, iss, sub, aud, iat, exp, nbf, or jti.
InvalidTypeForAdditionalClaim If the claim used in the child element <Claim> of the <AdditionalClaims> element is not of type string, number, boolean, or map, the deployment will fail.
MissingNameForAdditionalClaim If the name of the claim is not specified in the child element <Claim> of the <AdditionalClaims> element, the deployment will fail.
InvalidNameForAdditionalHeader This error ccurs when the name of the claim used in the child element <Claim> of the <AdditionalClaims> element is either alg or typ.
InvalidTypeForAdditionalHeader If the type of claim used in the child element <Claim> of the <AdditionalClaims> element is not of type string, number, boolean, or map, the deployment will fail.
InvalidValueOfArrayAttribute This error occurs when the value of the array attribute in the child element <Claim> of the <AdditionalClaims> element is not set to true or false.
InvalidConfigurationForActionAndAlgorithm If the <PrivateKey> element is used with HS Family algorithms or the <SecretKey> element is used with RSA Family algorithms, the deployment will fail.
InvalidValueForElement If the value specified in the <Algorithm> element is not a supported value, the deployment will fail.
MissingConfigurationElement This error will occur if the <PrivateKey> element is not used with RSA family algorithms or the <SecretKey> element is not used with HS Family algorithms.
InvalidKeyConfiguration If the child element <Value> is not defined in the <PrivateKey> or <SecretKey> elements, the deployment will fail.
EmptyElementForKeyConfiguration If the ref attribute of the child element <Value> of the <PrivateKey> or <SecretKey> elements is empty or unspecified, the deployment will fail.
InvalidVariableNameForSecret This error occurs if the flow variable name specified in the ref attribute of the child element <Value> of the <PrivateKey> or <SecretKey> elements does not contain the private prefix (private.).
InvalidSecretInConfig This error occurs if the child element <Value> of the <PrivateKey> or <SecretKey> elements does not contain the private prefix (private.).
InvalidTimeFormat If the value specified in the<NotBefore> element does not use a supported format, the deployment will fail.

Fault variables

These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "InvalidToken"
JWT.failed All JWT policies set the same variable in the case of a failure. JWT.failed = true

Example error response

JWT Policy Fault Codes

For error handling, the best practice is to trap the errorcode part of the error response. Do not rely on the text in the faultstring, because it could change.

Example fault rule

    <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>