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 criptato, con un insieme configurabile di claim. 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.

Questo criterio è un criterio estensibile e il suo utilizzo potrebbe comportare implicazioni in termini di costi o utilizzo, a seconda della licenza Apigee. Per informazioni sui tipi di criteri e sulle implicazioni per l'utilizzo, consulta Tipi di criteri.

Come

Il fatto che il criterio generi 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 per un JWT firmato

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

Algoritmo HS256

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

Quando viene attivata questa azione del criterio, Apigee codifica l'intestazione e il payload del JWT, quindi lo firma digitalmente. Guarda il video qui sopra per un esempio completo, incluso come presentare una richiesta in base alle norme.

La configurazione del criterio 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 tutti i reclami aggiuntivi che vuoi. Consulta la sezione di riferimento sugli elementi per informazioni dettagliate sui requisiti e sulle opzioni di ciascun elemento in questo criterio di esempio.

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

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

Il valore delle rivendicazioni iat, exp e jti varierà.

Algoritmo RS256

Questo criterio 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 PEM codificato e che può essere criptata con password. Guarda il video qui sopra per un esempio completo, incluso come presentare una richiesta in base alle norme.

Quando viene attivata questa azione del criterio, Apigee codifica e firma digitalmente il JWT, inclusi i claim. Per informazioni sulle parti di un JWT e su come vengono criptate e firmate, consulta la 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 precedenti utilizzano l'elemento <Algorithm>, quindi generano un JWT firmato. L'elemento <PrivateKey> specifica la chiave crittografica utilizzata per firmare il JWT. Esistono anche altri elementi chiave. La scelta dipende dall'algoritmo specificato dal valore di <Algorithm>, come descritto nella sezione successiva.

Impostazione degli elementi chiave per un JWT firmato

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

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

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 Informazioni sugli algoritmi di crittografia delle firme.

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

L'esempio seguente 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 della chiave 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 risolvere 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 risolvere in una chiave pubblica con 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 delle firme.

Riferimento elemento per Genera JWT

Il riferimento ai criteri descrive gli elementi e gli attributi del criterio Genera JWT.

Nota:la configurazione varia leggermente a seconda dell'algoritmo di crittografia utilizzato. Consulta Esempi per un JWT firmato o Esempio per un JWT criptato per esempi che mostrano le 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 Presence
nome Il nome interno del criterio. I caratteri che puoi utilizzare nel nome sono limitati a: A-Z0-9._\-$ %. Tuttavia, l'interfaccia utente di Apigee applica ulteriori limitazioni, ad esempio la rimozione automatica dei caratteri non alfanumerici.

Se vuoi, utilizza l'elemento <displayname></displayname> per etichettare il criterio nell'editor proxy dell'interfaccia utente di Apigee con un nome diverso in linguaggio naturale.

N/D Obbligatorio
continueOnError Imposta su false per restituire un errore quando un criterio non va a buon fine. Questo è un comportamento previsto per la maggior parte dei criteri.

Imposta su true per continuare l'esecuzione del flusso anche dopo un fallimento del criterio.

falso Facoltativo
abilitato Imposta su true per applicare il criterio.

Imposta su false per "disattivare" il criterio. 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>

Da utilizzare insieme all'attributo name per etichettare il criterio nell'editor proxy dell'interfaccia utente di Apigee con un nome diverso in linguaggio naturale.

Predefinito Se ometti questo elemento, viene utilizzato il valore dell'attributo name del criterio.
Presence 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
Presence (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>
</Algorithm>

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 risolvere 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 risolvere in una chiave pubblica a curva ellittica)

Consulta Genera 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 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'affermazione aud impostata sul valore specificato. Questo claim identifica i destinatari a cui è destinato il JWT. Si tratta di uno dei rivendicazioni registrati menzionati nella RFC7519.

Predefinito N/D
Presence 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'/>

Ti consente di specificare una o più coppie nome/valore dei claim aggiuntivi nel payload del JWT. Puoi specificare la rivendicazione esplicitamente come stringa, numero, booleano, mappa o array. Una mappa è semplicemente un insieme di coppie nome/valore.

Predefinito N/D
Presence Facoltativo
Valori validi Qualsiasi valore da utilizzare per un'affermazione aggiuntiva. Puoi specificare la rivendicazione esplicitamente come stringa, numero, booleano, mappa o array.

L'elemento <Claim> prevede i seguenti attributi:

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

Quando includi l'elemento <Claim>, i nomi dei rivendicatori vengono impostati in modo statico durante la configurazione del criterio. In alternativa, puoi passare un oggetto JSON per specificare i nomi dei rivendicatori. Poiché l'oggetto JSON viene passato come variabile, i nomi delle attestazioni nel JWT generato vengono determinati in fase di esecuzione.

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 attestazioni 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 dei claim aggiuntivi nell'intestazione del JWT.

Predefinito N/D
Presence Facoltativo
Valori validi Qualsiasi valore da utilizzare per un'affermazione aggiuntiva. Puoi specificare la rivendicazione esplicitamente come stringa, numero, booleano, mappa o array.

L'elemento <Claim> prevede i seguenti attributi:

  • name: (obbligatorio) il nome della rivendicazione.
  • ref: (Facoltativo) il nome di una variabile del flusso. Se presente, il criterio utilizzerà il valore di questa variabile come reclamo. Se vengono specificati sia un attributo ref sia un valore esplicito della rivendicazione, il valore esplicito è predefinito e viene utilizzato se la variabile di flusso a cui si fa riferimento non è risolta.
  • type: (facoltativo) Uno dei seguenti: stringa (valore predefinito), numero, booleano o mappa
  • array: (facoltativo) impostato 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 JWT. Ad esempio:

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

In base alle specifiche, le parti che eseguono la verifica devono esaminare l'intestazione crit e verificare che ciascuna di queste intestazioni sia compresa. Ad esempio, il criterio VerifyJWT esamina l'intestazione crit. Per ogni elemento elencato nell'intestazione crit, viene controllato che l'elemento <KnownHeaders> del criterio VerifyJWT elenchi anche l'intestazione. Qualsiasi intestazione trovata dal criterio VerifyJWT in crit che non è elencata anche in <KnownHeaders> causa il fallimento del criterio VerifyJWT.

Predefinito N/D
Presence 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, un elemento CustomClaims viene inserito quando aggiungi un nuovo criterio GenerateJWT tramite l'interfaccia utente. Questo elemento non è funzionale e viene ignorato. L'elemento corretto da utilizzare è <AdditionalClaims>. L'interfaccia utente verrà aggiornata per inserire gli elementi corretti in un secondo momento.

<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 si fa riferimento devono essere una stringa di codifica di un array di byte, codificata tramite uno dei formati 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 robustezza 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, di seguito è riportata 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, gli spazi vuoti sono accettati, ma non obbligatori, 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 non sono accettati e le lettere maiuscole sono importanti. Se non specifichi una codifica, il criterio presume che 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 esattamente la lunghezza corretta per l'algoritmo di crittografia dei contenuti specificato. Per qualsiasi algoritmo di crittografia della chiave diverso da dir, il criterio genera una CEK casuale della lunghezza corretta, ma per dir la configurazione deve fornire esplicitamente una chiave con le dimensioni corrette.

<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
Presence 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 valore ExpiresIn=10d è equivalente a un valore ExpiresIn di 864000 secondi.

<Id>

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

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

Predefinito N/D
Presence 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 il criterio generi un errore quando una variabile a cui viene fatto riferimento specificata nel criterio non è risolvibile. Imposta su true per trattare qualsiasi variabile non risolvibile come una stringa vuota (null).

Predefinito Falso
Presence Facoltativo
Tipo Booleano
Valori validi true o false

<Issuer>

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

Il criterio genera un JWT contenente un claim con nome iss,con un valore impostato sul valore specificato. Un'affermazione che identifica l'emittente del JWT. Si tratta di uno dei set di rivendicazioni registrati menzionati nella RFC7519.

Predefinito N/D
Presence 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 di tempo assoluto o un momento relativo al momento in cui viene generato il token.

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

Valori di tempo validi per l'elemento NotBefore per i valori di tempo assoluto

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:

  • 10s
  • 60 min
  • 12 ore

<OutputVariable>

<OutputVariable>jwt-variable</OutputVariable>

Specifica dove posizionare il JWT generato da questo criterio. Per impostazione predefinita, viene inserito nella variabile di flusso jwt.POLICYNAME.generated_jwt.

Predefinito jwt.POLICYNAME.generated_jwt
Presence 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 la crittografia di 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 chiavi, devi fornire una password da cui viene ricavata la chiave di crittografia della chiave tramite la variabileprivate.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 Numero di iterazioni PBKDF2: predefinito 10000.

<PrivateKey>

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

Specifica la chiave privata da utilizzare per generare un JWT firmato e Algorithm è una variante RSA o ellittica (EC), una di 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 stringa qualsiasi. 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 della chiave come claim 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, una di RS256/RS384/RS512 o PS256/PS384/PS512, devi fornire una chiave privata RSA codificata. Se l'elemento <Algorithm> contiene una variante EC, una di ES256/ES384/ES512, devi fornire una chiave privata di curva ellittica per la curva appropriata.

Password Facoltativo

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

Nota:devi specificare una variabile di flusso. Apigee rifiuterà come non valida una configurazione del criterio in cui la password è specificata in testo normale. 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 per generare un JWT criptato e l'algoritmo Key è una variante RSA o 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 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 il criterio deve utilizzare per criptare la chiave di crittografia dei contenuti. Puoi specificare la chiave in modo letterale 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 racchiude una chiave pubblica. Apigee estrae la chiave pubblica dal certificato e la utilizza per criptare la chiave di crittografia dei contenuti. Puoi specificare il certificato in modo letterale 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 oppure una chiave EC della curva appropriata se utilizzi un algoritmo EC.

JWKS

Un'origine JWKS di chiavi pubbliche. Si tratta di un elenco di chiavi che segue il formato descritto in IETF RFC 7517 - JSON Web Key (JWK).

Puoi specificare il JWKS in quattro modi:

  • 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 si fa 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 in 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 file JWKS con un campo kid che corrisponde a questo valore. L'elemento Id è obbligatorio se utilizzi l'elemento JWKS in 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 per generare un JWT firmato che utilizza un algoritmo simmetrico (HS*) o per generare 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
encoding (attributo) Facoltativo

Specifica in che modo la chiave viene codificata nella variabile a cui viene fatto riferimento. Per impostazione predefinita, se 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 sarà 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 stringa qualsiasi. 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 della chiave come claim 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 robustezza minima della chiave per gli algoritmi HS256/HS384/HS512. La lunghezza minima della chiave per HS256 è 32 byte, per HS384 è 48 byte e per HS512 è 64 byte. L'utilizzo di una chiave con un'intensità inferiore causa un errore di runtime.

<Subject>

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

Ad esempio:

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

Il criterio genera un JWT contenente un claim sub impostato sul valore specificato.Questo claim identifica o fornisce una dichiarazione sull'oggetto del JWT. Si tratta di uno degli annunci standard menzionati nella RFC 7519 di IETF.

Predefinito N/D
Presence Facoltativo
Tipo Stringa
Valori validi Qualsiasi valore che identifica 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 criptato. L'elemento <Type> è facoltativo. Puoi utilizzarlo per informare i lettori della configurazione se il criterio genera un JWT firmato o criptato.

  • Se è presente l'elemento <Type>:
    • Se il valore di <Type> è Signed, il criterio genera un JWT firmato e deve essere presente l'elemento <Algorithm>.
    • 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 assume <Type> sia Encrypted.
  • Se non sono presenti né <Algorithm><Algorithms>, la configurazione non è valida.
Predefinito N/D
Presence Facoltativo
Tipo Stringa
Valori validi Signed o Encrypted

Variabili di flusso

Il criterio Genera JWT non imposta le variabili di flusso.

Messaggi di errore

Questa sezione descrive i codici di errore e i messaggi di errore restituiti e le variabili di errore impostate da Apigee quando questo criterio attiva un errore. Queste informazioni sono importanti se stai sviluppando regole di errore per gestire gli errori. Per scoprire di più, consulta Informazioni importanti sugli errori relativi alle norme e Gestione degli errori.

Errori di runtime

Questi errori possono verificarsi durante l'esecuzione del criterio.

Codice guasto Stato HTTP Si verifica quando
steps.jwt.AlgorithmInTokenNotPresentInConfiguration 401 Si verifica quando il criterio di verifica ha più algoritmi.
steps.jwt.AlgorithmMismatch 401 L'algoritmo specificato nel criterio Genera non corrisponde a quello previsto nel criterio Verifica. Gli algoritmi specificati devono corrispondere.
steps.jwt.EncryptionFailed 401 La creazione di un JWT criptato non è riuscita per un motivo non specifico
steps.jwt.FailedToDecode 401 Il criterio non è stato in grado di decodificare il JWT. Il JWT potrebbe essere danneggiato.
steps.jwt.GenerationFailed 401 Il criterio non è stato in grado di generare il JWT.
steps.jwt.InsufficientKeyLength 401 Per una chiave inferiore a 32 byte per l'algoritmo HS256, inferiore a 48 byte per l'algoritmo HS386 e inferiore a 64 byte per l'algoritmo HS512.
steps.jwt.InvalidClaim 401 Per una richiesta mancante o una mancata corrispondenza della richiesta oppure per un'intestazione mancante o una mancata corrispondenza dell'intestazione.
steps.jwt.InvalidConfiguration 401 Sono presenti entrambi gli elementi <Algorithm> e <Algorithms>.
steps.jwt.InvalidCurve 401 La curva specificata dalla chiave non è valida per l'algoritmo di curva ellittica.
steps.jwt.InvalidJsonFormat 401 JSON non valido trovato nell'intestazione o nel payload.
steps.jwt.InvalidPasswordKey 401 La chiave specificata non soddisfa i requisiti.
steps.jwt.InvalidPrivateKey 401 La chiave specificata non soddisfa i requisiti.
steps.jwt.InvalidPublicKey 401 La chiave specificata non soddisfa i requisiti.
steps.jwt.InvalidSecretKey 401 La chiave specificata non soddisfa i requisiti.
steps.jwt.InvalidToken 401 Questo errore si verifica quando la verifica della firma JWT non va a buon fine.
steps.jwt.JwtAudienceMismatch 401 L'affermazione sul pubblico non è riuscita durante la verifica del token.
steps.jwt.JwtIssuerMismatch 401 L'affermazione dell'emittente non è riuscita durante la verifica del token.
steps.jwt.JwtSubjectMismatch 401 L'affermazione del soggetto non è riuscita durante la verifica del token.
steps.jwt.KeyIdMissing 401 Il criterio di verifica utilizza un JWKS come origine per le chiavi pubbliche, ma il JWT firmato non include una proprietà kid nell'intestazione.
steps.jwt.KeyParsingFailed 401 Non è stato possibile analizzare la chiave pubblica dalle informazioni sulla chiave fornite.
steps.jwt.NoAlgorithmFoundInHeader 401 Si verifica quando il JWT non contiene un'intestazione dell'algoritmo.
steps.jwt.NoMatchingPublicKey 401 Il criterio di verifica utilizza un JWKS come origine per le chiavi pubbliche, ma kid nel JWT firmato non è elencato nel JWKS.
steps.jwt.SigningFailed 401 In GenerateJWT, per una chiave inferiore alla dimensione minima per gli algoritmi HS384 o HS512
steps.jwt.TokenExpired 401 Il criterio tenta di verificare un token scaduto.
steps.jwt.TokenNotYetValid 401 Il token non è ancora valido.
steps.jwt.UnhandledCriticalHeader 401 Un'intestazione trovata dal criterio Verifica JWT nell'intestazione crit non è elencata in KnownHeaders.
steps.jwt.UnknownException 401 Si è verificata un'eccezione sconosciuta.
steps.jwt.WrongKeyType 401 Tipo di chiave specificato errato. Ad esempio, se specifichi una chiave RSA per un algoritmo Elliptic Curve o una chiave a curva per un algoritmo RSA.

Errori di deployment

Questi errori possono verificarsi quando esegui il deployment di un proxy contenente questo criterio.

Nome dell'errore Causa Correggi
InvalidNameForAdditionalClaim Il deployment non andrà a buon fine se il claim utilizzato nell'elemento secondario <Claim> dell'elemento <AdditionalClaims> è uno dei seguenti nomi registrati: kid, iss, sub, aud, iat, exp, nbf o jti.
InvalidTypeForAdditionalClaim Se il claim utilizzato nell'elemento secondario <Claim> dell'elemento <AdditionalClaims> non è di tipo string, number, boolean o map, il deployment non andrà a buon fine.
MissingNameForAdditionalClaim Se il nome della rivendicazione non è specificato nell'elemento secondario <Claim> dell'elemento <AdditionalClaims>, il deployment non andrà a buon fine.
InvalidNameForAdditionalHeader Questo errore si verifica quando il nome della rivendicazione utilizzato nell'elemento secondario <Claim> dell'elemento <AdditionalClaims> è alg o typ.
InvalidTypeForAdditionalHeader Se il tipo di rivendicazione utilizzato nell'elemento secondario <Claim> dell'elemento <AdditionalClaims> non è di tipo string, number, boolean o map, il deployment non andrà a buon fine.
InvalidValueOfArrayAttribute Questo errore si verifica quando il valore dell'attributo array nell'elemento secondario <Claim> dell'elemento <AdditionalClaims> non è impostato su true o false.
InvalidConfigurationForActionAndAlgorithm Se l'elemento <PrivateKey> viene utilizzato con gli algoritmi della famiglia HS o l'elemento <PrivateKey> viene utilizzato con gli algoritmi della famiglia RSA, il deployment non andrà a buon fine.<SecretKey>
InvalidValueForElement Se il valore specificato nell'elemento <Algorithm> non è supportato, il deployment non andrà a buon fine.
MissingConfigurationElement Questo errore si verifica se l'elemento <PrivateKey> non viene utilizzato con gli algoritmi della famiglia RSA o se l'elemento <SecretKey> non viene utilizzato con gli algoritmi della famiglia HS.
InvalidKeyConfiguration Se l'elemento secondario <Value> non è definito negli elementi <PrivateKey> o <SecretKey>, il deployment non andrà a buon fine.
EmptyElementForKeyConfiguration Se l'attributo ref dell'elemento secondario <Value> degli elementi <PrivateKey> o <SecretKey> è vuoto o non specificato, il deployment non andrà a buon fine.
InvalidVariableNameForSecret Questo errore si verifica se il nome della variabile di flusso specificato nell'attributo ref dell'elemento figlio <Value> degli elementi <PrivateKey> o <SecretKey> non contiene il prefisso privato (private.).
InvalidSecretInConfig Questo errore si verifica se l'elemento figlio <Value> degli elementi <PrivateKey> o <SecretKey> non contiene il prefisso privato (private.).
InvalidTimeFormat Se il valore specificato nell'elemento <NotBefore> non utilizza un formato supportato, il deployment non andrà a buon fine.

Variabili di errore

Queste variabili vengono impostate quando si verifica un errore di runtime. Per ulteriori informazioni, vedi Cosa devi sapere sugli errori relativi alle norme.

Variabili Dove Esempio
fault.name="fault_name" fault_name è il nome dell'errore, come indicato nella tabella Errori di runtime sopra. Il nome dell'errore è l'ultima parte del codice di errore. fault.name Matches "InvalidToken"
JWT.failed Tutti i criteri JWT impostano la stessa variabile in caso di errore. JWT.failed = true

Esempio di risposta di errore

Codici di errore dei criteri JWT

Per la gestione degli errori, la best practice è intercettare la parte errorcode della risposta all'errore. Non fare affidamento sul testo in faultstring, perché potrebbe cambiare.

Esempio di regola di errore

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