Stratégie GenerateJWT

Cette page s'applique à Apigee et à Apigee hybrid.

Consultez la documentation d'Apigee Edge.

icône de la règle

Quoi

Génère un jeton JWT signé ou un jeton JWT chiffré, avec un ensemble configurable de revendications. Le jeton JWT peut ensuite être renvoyé aux clients, transmis à des cibles de backend ou être utilisé d'une autre manière. Consultez la section Présentation des règles JWS et JWT pour une présentation détaillée.

Cette règle est une règle extensible et son utilisation peut avoir des conséquences sur le coût ou l'utilisation, en fonction de votre licence Apigee. Pour en savoir plus sur les types de règles et les implications en termes d'utilisation, consultez la section Types de règles.

Comment

La stratégie génère un jeton JWT signé ou chiffré en fonction de l'élément que vous utilisez pour spécifier l'algorithme qui génère le jeton JWT :

Vidéo

Regardez une courte vidéo pour apprendre à générer un jeton JWT signé.

Générer un jeton JWT signé

Cette section explique comment générer un jeton JWT signé. Pour un jeton JWT signé, utilisez l'élément <Algorithm> pour spécifier l'algorithme de signature de la clé.

Exemples pour un jeton JWT signé

Les exemples suivants montrent comment générer un jeton JWT signé.

Algorithme HS256

Cet exemple de stratégie génère un nouveau jeton JWT et le signe à l'aide de l'algorithme HS256. L'algorithme HS256 repose sur une clé secrète partagée à la fois pour signer et valider la signature.

Lorsque cette action de stratégie est déclenchée, Apigee encode l'en-tête et la charge utile JWT, puis signe numériquement le JWT. Regardez la vidéo ci-dessus pour voir un exemple complet, y compris pour découvrir comment envoyer une demande à la stratégie.

La configuration de la stratégie créera un jeton JWT avec un ensemble de revendications standards telles que définies par la spécification JWT, y compris un délai d'expiration d'une heure, ainsi qu'une revendication supplémentaire. Vous pouvez inclure autant de revendications que vous le souhaitez. Consultez la documentation de référence sur les éléments pour en savoir plus sur les exigences et les options de chaque élément dans cet exemple de règle.

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

Le JWT obtenu contient cet en-tête…

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

… et disposera d'une charge utile avec du contenu qui ressemble à ceci :

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

La valeur des revendications iat, exp et jti varie.

Algorithme RS256

Cet exemple de stratégie génère un nouveau jeton JWT et le signe à l'aide de l'algorithme RS256. La génération d'une signature RS256 repose sur une clé privée RSA, qui doit être fournie au format PEM et peut éventuellement être chiffrée par mot de passe. Regardez la vidéo ci-dessus pour voir un exemple complet, y compris pour découvrir comment envoyer une demande à la stratégie.

Lorsque cette action de stratégie est déclenchée, Apigee encode et signe numériquement le JWT, y compris les revendications. Pour en savoir plus sur les composants d'un jeton JWT, ainsi que sur la façon dont ceux-ci sont chiffrés et signés, consultez le document 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>

Les exemples ci-dessus utilisent l'élément <Algorithm>, de sorte qu'ils génèrent un jeton JWT signé. L'élément <PrivateKey> spécifie la clé cryptographique utilisée pour signer le jeton JWT. Il existe également d'autres éléments clés. La méthode que vous utilisez dépend de l'algorithme spécifié par la valeur de <Algorithm>, comme décrit dans la section suivante.

Définir les éléments de clé d'un jeton JWT signé

Utilisez exactement l'un des éléments suivants pour spécifier la clé utilisée pour générer un jeton JWT signé :

L'élément que vous utilisez dépend de l'algorithme choisi, comme indiqué dans le tableau suivant :

Algorithme Éléments clés
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>

Dans les exemples ci-dessus, les éléments <Password> et <Id> sont facultatifs.

Pour en savoir plus sur les conditions requises par les clés, consultez la section À propos des algorithmes de chiffrement de signature.

Générer un jeton JWT chiffré

Cette section explique comment générer un jeton JWT chiffré. Pour un jeton JWT chiffré, utilisez l'élément <Algorithms> pour spécifier les algorithmes de signature de la clé et du contenu.

Exemple de jeton JWT chiffré

L'exemple suivant montre comment générer un jeton JWT chiffré. L'exemple utilise l'élément <Algorithms>, il génère donc un jeton JWT chiffré.

RSA-OAEP-256

Dans l'exemple ci-dessous :

  • La clé est chiffrée avec l'algorithme RSA-OAEP-256.
  • Le contenu est chiffré avec l'algorithme A128GCM.

L'élément <PublicKey> spécifie la clé utilisée pour le chiffrement de clé.

<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

Dans l'exemple ci-dessous :

  • La clé est chiffrée avec l'algorithme A128KW.
  • le contenu est chiffré avec l'algorithme A128GCM.

L'élément <SecretKey> spécifie la clé utilisée pour le chiffrement de clé.

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

Définir les éléments de clé d'un jeton JWT chiffré

Utilisez exactement l'un des éléments suivants pour spécifier la clé de chiffrement pour GenerateJWT, lorsque vous souhaitez générer un jeton JWT chiffré :

L'élément que vous utilisez dépend de l'algorithme de chiffrement de clé choisi, comme indiqué dans le tableau suivant :

Algorithme de chiffrement de clé Éléments clés
RSA-OAEP-256
<PublicKey>
  <Value ref="rsa_publickey"/>
</PublicKey>

Remarque : La clé doit correspondre à une clé publique RSA.

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

Remarque : La clé doit correspondre à une clé publique à courbe elliptique.

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

Pour en savoir plus sur les conditions requises par les clés, consultez la section À propos des algorithmes de chiffrement de signature.

Référence d'élément pour générer un JWT

La documentation de référence des stratégies décrit les éléments et les attributs de la stratégie de génération de JWT.

Remarque : La configuration diffère légèrement selon l'algorithme de chiffrement que vous utilisez. Consultez la section Exemples pour un jeton JWT signé ou Exemple pour un jeton JWT chiffré pour obtenir des exemples illustrant des configurations pour des cas d'utilisation spécifiques.

Attributs qui s'appliquent à l'élément de premier niveau

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

Les attributs suivants sont communs à tous les éléments parents de la stratégie.

Attribut Description Par défaut Presence
nom Nom interne de la stratégie. Les caractères que vous pouvez utiliser dans le nom se limitent à : A-Z0-9._\-$ %. L'interface utilisateur Apigee applique cependant des restrictions supplémentaires, telles que la suppression automatique des caractères qui ne sont pas alphanumériques.

Vous pouvez également utiliser l'élément <displayname></displayname> pour ajouter un libellé à la règle dans l'éditeur de proxy de l'interface utilisateur d'Apigee, en utilisant un nom différent, en langage naturel.

N/A Obligatoire
continueOnError Définissez sur false pour afficher une erreur en cas d'échec d'une stratégie. Il s'agit du comportement attendu pour la plupart des règles.

Définissez sur true pour que l'exécution du flux se poursuive même après l'échec d'une règle.

false Facultatif
activé Définissez la valeur sur true pour appliquer la stratégie.

Définissez la valeur sur false pour "désactiver" la stratégie. La stratégie ne sera pas appliquée même si elle reste associée à un flux.

true Facultatif
async Cet attribut est obsolète. false Obsolète

<DisplayName>

<DisplayName>Policy Display Name</DisplayName>

À utiliser, en plus de l'attribut, pour appliquer un libellé à la règle dans l'éditeur de proxy de l'interface utilisateur d'Apigee en utilisant un nom différent, en langage naturel.

Par défaut Si vous omettez cet élément, la valeur de l'attribut de nom de la stratégie est utilisée.
Presence Facultatif
Type Chaîne

<Algorithm>

<Algorithm>algorithm-here</Algorithm>

Spécifie l'algorithme cryptographique utilisé pour signer le jeton. Utilisez l'élément <Algorithm> pour générer un jeton JWT signé.

Par défaut N/A
Presence Facultatif. Vous devez indiquer <Algorithm> ou <Algorithms>.
Type Chaîne
Valeurs valides HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512

<Algorithms>

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

Spécifie les algorithmes cryptographiques pour le chiffrement de clé et de contenu. Utilisez l'élément <Algorithms> pour générer un jeton JWT chiffré.

Par défaut N/A
Facultatif. Vous devez indiquer <Algorithm> ou <Algorithms>. Requis
Type Chaîne

Éléments enfants de <Algorithms>

Le tableau suivant fournit une description détaillée des éléments enfants de <Algorithms> :

Élément enfant Obligatoire ? Description
<Key> Obligatoire Spécifie l'algorithme de chiffrement de clé.
<Content> Requis Spécifie l'algorithme de chiffrement de contenu.

Algorithmes de chiffrement de clé

Le tableau suivant liste les algorithmes disponibles pour le chiffrement de clé.

Valeur de <Key> (algorithme de chiffrement de clé) Élément de clé requis
dir <DirectKey>
RSA-OAEP-256 <PublicKey> (qui doit correspondre à une clé publique 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> (qui doit correspondre à une clé publique à courbe elliptique)

Pour obtenir un exemple d'algorithme de chiffrement de clé RSA-OAEP-256, consultez la section Générer un jeton JWT chiffré, ce qui implique d'utiliser l'élément <PublicKey> avec valeur correspondant à une clé publique RSA.

Algorithmes de chiffrement de contenu

Les algorithmes suivants (symétriques, AES) sont disponibles pour le chiffrement de contenu :

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

Pour plus d'informations sur tous ces algorithmes, consultez la RFC7518.

<Audience>

<Audience>audience-here</Audience>

or:

<Audience ref='variable_containing_audience'/>

La règle génère un jeton JWT contenant une revendication aud définie sur la valeur spécifiée. Cette revendication identifie les destinataires du jeton JWT. Il s'agit de l'une des revendications enregistrées et mentionnées dans le document RFC7519.

Par défaut N/A
Presence Facultatif
Type Tableau (liste de valeurs séparées par une virgule)
Valeurs valides Tout ce qui identifie l'audience.

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

Permet de spécifier une ou plusieurs paires nom/valeur de revendication supplémentaires dans la charge utile du JWT. Vous pouvez spécifier explicitement la revendication sous forme de chaîne, d'un nombre, d'une valeur booléenne, d'un mappage ou d'un tableau. Un mappage est simplement un ensemble de paires nom/valeur.

Par défaut N/A
Presence Facultatif
Valeurs valides Toute valeur que vous souhaitez utiliser dans une revendication supplémentaire. Vous pouvez spécifier explicitement la revendication sous forme de chaîne, d'un nombre, d'une valeur booléenne, d'un mappage ou d'un tableau.

L'élément <Claim> utilise les attributs suivants :

  • name : (obligatoire) nom de la revendication.
  • ref (facultatif) : nom d'une variable de flux. Si elle est présente, la règle utilise la valeur de cette variable comme revendication. Si un attribut ref et une valeur de revendication explicite sont spécifiés, la valeur explicite est la valeur par défaut, et est utilisée si la variable de flux référencée n'est pas résolue.
  • type : (facultatif) au choix : chaîne (par défaut), nombre, valeur booléenne ou mappage
  • array : (facultatif) défini sur true pour indiquer que la valeur est un tableau de types. Valeur par défaut : "false".

Lorsque vous incluez l'élément <Claim>, les noms des revendications sont définis de manière statique lorsque vous configurez la règle. Vous pouvez également transmettre un objet JSON afin de spécifier les noms des revendications. L'objet JSON étant transmis en tant que variable, les noms de revendication dans le jeton JWT généré sont déterminés au moment de l'exécution.

Exemple :

<AdditionalClaims ref='json_claims'/>

Où la variable json_claims contient un objet JSON au format :

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

Le jeton JWT généré inclut toutes les revendications de l'objet 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>

Place les paires nom/valeur de revendication supplémentaires dans l'en-tête du jeton JWT.

Par défaut N/A
Presence Facultatif
Valeurs valides Toute valeur que vous souhaitez utiliser dans une revendication supplémentaire. Vous pouvez spécifier explicitement la revendication sous forme de chaîne, d'un nombre, d'une valeur booléenne, d'un mappage ou d'un tableau.

L'élément <Claim> utilise les attributs suivants :

  • name : (obligatoire) nom de la revendication.
  • ref (facultatif) : nom d'une variable de flux. Si elle est présente, la règle utilise la valeur de cette variable comme revendication. Si un attribut ref et une valeur de revendication explicite sont spécifiés, la valeur explicite est la valeur par défaut, et est utilisée si la variable de flux référencée n'est pas résolue.
  • type : (facultatif) au choix : chaîne (par défaut), nombre, valeur booléenne ou mappage
  • array : (facultatif) défini sur true pour indiquer que la valeur est un tableau de types. Valeur par défaut : "false".

<Compress>

<Compress>true</Compress>

Indique si le texte est compressé avant le chiffrement. Cet élément n'est valide que lors de la génération d'un jeton JWT chiffré.

<CriticalHeaders>

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

or:

<CriticalHeaders ref=variable_containing_headers/>

Ajoute l'en-tête critique crit à l'en-tête JWT. L'en-tête crit est un tableau de noms d'en-têtes qui doivent être connus et reconnus par le destinataire du jeton JWT. Exemple :

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

Conformément à la spécification, le processus de vérification des parties doit examiner l'en-tête crit et vérifier que tous ces en-têtes sont bien compris. Par exemple, la stratégie VerifyJWT examine l'en-tête crit. Pour chaque élément répertorié dans l'en-tête crit, celle-ci vérifie que l'élément <KnownHeaders> de la stratégie VerifyJWT répertorie également cet en-tête. Tout en-tête identifié par la stratégie VerifyJWT dans crit et qui ne figure pas encore dans le fichier <KnownHeaders> entraîne l'échec de la stratégie VerifyJWT.

Par défaut N/A
Presence Facultatif
Type Tableau de chaînes séparées par une virgule
Valeurs valides Tableau ou nom d'une variable contenant le tableau.

<CustomClaims>

Remarque : Actuellement, un élément CustomClaims est inséré lorsque vous ajoutez une nouvelle règle GenerateJWT via l'interface utilisateur. Cet élément n'est pas fonctionnel et est ignoré. L'élément correct à utiliser à la place est <AdditionalClaims>. L'interface utilisateur sera mise à jour pour insérer les éléments corrects ultérieurement.

<DirectKey>

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

Spécifie une clé directe pour chiffrer un jeton JWT lorsque l'algorithme de chiffrement est dir (chiffrement direct).

Éléments enfants de <DirectKey>

Le tableau suivant fournit une description détaillée des éléments enfants de <DirectKey> :

Élément enfant Obligatoire ? Description
ID Facultatif Identifiant de clé
Valeur Requis Spécifiez une référence à une variable avec l'attribut ref. Le contenu de la variable référencée doit être un encodage de chaîne d'un tableau d'octets, encodé en hexadécimal (base16), en base64 ou en base64url.

Le chiffrement direct des clés vous permet de fournir directement une série d'octets qui serviront de clé de chiffrement de contenu (CEK, pour "Content Encryption Key"). Vous devez spécifier le tableau d'octets sous forme de chaîne encodée. La longueur requise du tableau d'octets dépend de la puissance de l'algorithme de chiffrement de contenu sélectionné. Par exemple, pour A256CBC-HS512, vous devez fournir une clé de exactement 512 bits, soit 64 octets.

Le contenu de la variable private.directkey doit être une chaîne encodée en hexadécimal (base16), en base64 ou en base64url. Par exemple, voici une clé de 32 octets encodée en hexadécimal :

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

Pour l'encodage hexadécimal, les espaces sont acceptés, mais pas obligatoires, et les majuscules ou minuscules sont acceptées (B7 est identique à b7).

L'équivalent du code ci-dessus en base64url est le suivant :

lkvhcRVxX4cRDhNSTOweut9HYhqdO/Wt0nuyNefWFxE

Pour les variantes base64*, les espaces ne sont pas acceptés et la casse est prise en compte. Si vous ne spécifiez pas d'encodage, la règle suppose que l'encodage est en base64.

La section suivante décrit la longueur de clé requise :

Algorithme de chiffrement du contenu Exigence de longueur de clé
A128CBC-HS256 256 bits (32 octets)
A192CBC-HS384 384 (48)
A256CBC-HS512 512 (64)
A128GCM 128 (16)
A192GCM 192 (24)
A256GCM 256 (32)

Remarque : La clé de chiffrement de contenu fournie via l'élément <DirectKey> doit correspondre exactement à la longueur requise pour l'algorithme de chiffrement de contenu spécifié. Pour tout algorithme de chiffrement de clé autre que dir, la stratégie génère une CEK aléatoire de longueur correcte. Pour dir, la configuration doit explicitement fournir une clé de taille adaptée.

<Audience>

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

or:

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

Spécifie la durée de vie du JWT en millisecondes, secondes, minutes, heures ou jours. Spécifiez le délai d'expiration à l'aide de l'élément XML ou de l'attribut "ref", mais pas des deux.

Par défaut N/A
Presence Facultatif
Type Entier
Valeurs valides

Valeur ou référence à une variable de flux contenant la valeur. Les unités de temps peuvent être spécifiés comme suit :

  • ms = millisecondes (par défaut)
  • s = secondes
  • m = minutes
  • h = heures
  • d = jours

Par exemple, une valeur ExpiresIn=10d équivaut à une valeur ExpiresIn de 864 000 s.

<Id>

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

Génère un jeton JWT avec la revendication jti spécifique. Lorsque la valeur textuelle et l'attribut "ref" sont tous deux vides, la règle génère un jti contenant un UUID aléatoire. La revendication de l'ID JWT (jti) est un identifiant unique du jeton JWT. Pour en savoir plus sur jti, consultez le document RFC7519.

Par défaut N/A
Presence Facultatif
Type Chaîne ou référence.
Valeurs valides Chaîne ou nom d'une variable de flux contenant l'ID.

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

Définissez la valeur sur "false" si vous souhaitez que la règle génère une erreur lorsqu'une variable référencée dans la règle ne peut être résolue. Définissez la valeur sur "true" pour traiter toute variable irrésolue comme une chaîne vide (null).

Par défaut Faux
Presence Facultatif
Type Booléen
Valeurs valides true ou false

<Issuer>

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

La règle génère un jeton JWT contenant une revendication portant le nom iss, avec une valeur définie sur la valeur spécifiée. C'est une revendication qui identifie l'émetteur du jeton JWT. Il s'agit d'un ensemble de revendications enregistrées et mentionnées dans le document RFC7519.

Par défaut N/A
Presence Facultatif
Type Chaîne ou référence
Valeurs valides Toutes

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

Indique l'heure à laquelle le jeton devient valide. Le jeton n'est pas valide avant l'heure spécifiée. Vous pouvez spécifier une valeur temporelle absolue ou une heure en fonction du moment où le jeton est généré.

Par défaut N/A
Presence Facultatif
Type Chaîne
Valeurs valides Voir ci-dessous.

Valeurs de temps valides pour l'élément NotBefore pour les valeurs de délai absolu

Nom Format Exemple
sortable 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 août 2017 à 11h00 et 21 secondes (PDT)
RFC 850 EEEE, dd-MMM-yy HH:mm:ss zzz Lundi 14 août 2017 à 11h00 et 21 secondes (PDT)
ANCI-C EEE MMM d HH:mm:ss yyyy Lun 14 août 2017 à 11h00 et 21 secondes (PDT)

Pour les valeurs de délai relatif, spécifiez un entier et une période, par exemple :

  • 10 s
  • 60 min
  • 12 h

<OutputVariable>

<OutputVariable>jwt-variable</OutputVariable>

Indique où placer le jeton JWT généré par cette stratégie. Par défaut, celui-ci est placé dans la variable de flux jwt.POLICYNAME.generated_jwt.

Par défaut jwt.POLICYNAME.generated_jwt
Presence Facultatif
Type Chaîne (nom de variable de flux)

<PasswordKey>

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

Spécifie une clé de chiffrement JWT lorsque l'algorithme de chiffrement est l'un des éléments suivants :

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

Pour chacun de ces algorithmes de clé, vous devez fournir un mot de passe d'où la clé de chiffrement de clé est dérivée, via la variable private.password dans l'élément <Value ref="private.password"/>.

Éléments enfants de <PasswordKey>

Le tableau suivant fournit une description détaillée des éléments enfants de <PasswordKey> :

Élément enfant Presence Description
ID Facultatif Identifiant de clé
Valeur Requis Spécifie le mot de passe utilisé pour générer la clé de chiffrement de clé. Utilisez un attribut ref et spécifiez une variable comme private.password.
SaltLength Facultatif Longueur de salage. Valeur par défaut : 8 octets.
PBKDF2Iterations Facultatif Nombre d'itérations PBKDF2 : par défaut, 10 000.

<PrivateKey>

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

Spécifie la clé privée à utiliser lors de la génération d'un jeton JWT signé, Algorithm étant une variante RSA ou à courbe elliptique (EC) choisie parmi RS256/RS384/RS512, PS256/PS384/PS512, ou ES256/ES384/ES512.

Éléments enfants de <PrivateKey>

Le tableau suivant fournit une description des éléments enfants de <PrivateKey> :

Élément enfant Presence Description
ID Facultatif

Identifiant de clé. La valeur peut être n'importe quelle chaîne. Vous pouvez spécifier la valeur sous forme de valeur texte littérale, ou indirectement, via une référence de variable, avec l'attribut ref.

La règle inclut cet identifiant de clé en tant que revendication kid dans l'en-tête du jeton JWT généré.

Valeur Requis

Clé privée encodée au format PEM. Spécifie la clé privée utilisée pour signer la charge utile. Utilisez un attribut ref et spécifiez une variable comme private.private-key.

Si l'élément <Algorithm> contient une variante RSA, à savoir RS256/RS384/RS512 ou PS256/PS384/PS512, vous devez alors fournir une adresse RSA privée encodée. Si l'élément <Algorithm> contient une variante EC, à savoir ES256/ES384/ES512, vous devez fournir une clé privée à courbe elliptique pour la courbe appropriée.

Mot de passe Facultatif

Le mot de passe que la règle doit utiliser pour déchiffrer la clé privée, si nécessaire. Utilisez l'attribut ref pour transmettre le mot de passe via une variable de flux.

Remarque : Vous devez spécifier une variable de flux. Apigee rejettera la configuration d'une stratégie non valide dans laquelle le mot de passe est spécifié en texte brut. La variable de flux doit comporter le préfixe "private". Par exemple, 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>

Spécifie la clé publique à utiliser lors de la génération d'un jeton JWT chiffré, l'algorithme Key étant une variante RSA ou à courbe elliptique (EC) choisie parmi RSA-OAEP-256, ECDH-ES, ECDH-ES+A128KW, ECDH-ES+A192KW ou ECDH-ES+A256KW.

Éléments enfants de <PublicKey>

Indiquez Value, Certificate ou JWKS. Si vous spécifiez JWKS, vous devez également spécifier Id. Le tableau suivant fournit une description de ces éléments enfants de <PublicKey> :

Élément enfant Description
Valeur

Clé publique encodée au format PEM. Spécifie la clé publique que la règle doit utiliser pour chiffrer la clé de chiffrement du contenu. Vous pouvez spécifier la clé littéralement ou indirectement via une référence de variable.

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

ou

<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 clé publique codée doit désigner une clé RSA si vous utilisez l'algorithme RSA-OAEP-256 ou une clé à courbe elliptique de la courbe appropriée si vous utilisez un algorithme EC.

Certificat

Certificat X.509 encodé au format PEM, encapsulant une clé publique. Apigee extrait la clé publique du certificat, puis l'utilise pour chiffrer la clé de chiffrement du contenu. Vous pouvez spécifier la clé littéralement ou indirectement via une référence de variable.

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

ou

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

La clé publique codée doit désigner une clé RSA si vous utilisez l'algorithme RSA-OAEP-256 ou une clé à courbe elliptique de la courbe appropriée si vous utilisez un algorithme EC.

JWKS

Une source JWKS de clés publiques. Cette section répertorie les clés au format décrit dans IETF RFC 7517 – JSON Web Key (JWK).

Vous pouvez spécifier les JWKS de l'une des quatre manières suivantes :

  • Littéralement, sous forme de valeur texte :

    <PublicKey>
      <JWKS>jwks-content-here</JWKS>
      <Id ref="variable-containing-a-kid">literal-value-here</Id>
    </PublicKey>
  • Indirectement avec l'attribut ref, en spécifiant une variable de flux :

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

    La variable référencée doit contenir une chaîne représentant un JWKS.

  • Indirectement via un URI statique, avec l'attribut uri :

    <PublicKey>
      <JWKS uri="uri-that-returns-a-jwks"/>
      <Id ref="variable-containing-a-kid">literal-value-here</Id>
    </PublicKey>
  • Indirectement via un URI déterminé dynamiquement, avec l'attribut uriRef :

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

Dans tous les cas, lorsque vous spécifiez un élément JWKS dans GenerateJWT pour générer un jeton JWT chiffré, vous devez également spécifier l'élément PublicKey/Id.

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

Chaîne représentant l'identifiant de clé. Au moment de l'exécution, Apigee récupère, à partir de JWKS, une clé dont le champ kid correspond à cette valeur. L'élément Id est obligatoire si vous utilisez l'élément JWKS dans 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'élément SecretKey est facultatif. Spécifie la clé secrète à utiliser lors de la vérification d'un jeton JWT signé utilisant un algorithme symétrique (HS*) ou lors de la vérification d'un jeton JWT chiffré utilisant un algorithme symétrique (AES) pour le chiffrement de clé.

Enfants de <SecretKey>

Le tableau suivant fournit une description des éléments enfants et des attributs de <SecretKey> :

Enfant Presence Description
codage (attribut) Facultatif

Spécifie le mode d'encodage de la clé dans la variable référencée. Par défaut, lorsqu'aucun attribut encoding n'est présent, l'encodage de la clé est traité comme étant UTF-8. Les valeurs valides pour l'attribut sont hexadécimal, base16, base64 ou base64url. Les valeurs d'encodage hexadécimales et base16 sont des synonymes.

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

Dans l'exemple ci-dessus, lorsque l'attribut d'encodage est hex et que le contenu de la variable private.secretkey est 494c6f766541504973, la clé est décodée comme un ensemble de 9 octets, ce qui dans hexadécimal sera 49 4c 6f 76 65 41 50 49 73. Inversement, lorsque l'attribut d'encodage est base64, et le contenu de la variable private.secretkey est VGhpcy1pcy1hLXNlY3JldA, la clé est décodée sous la forme d'un ensemble de 16 octets, au format hexadécimal : 54 68 69 73 2d 69 73 2d 61 2d 73 65 63 72 65 74.

ID (élément) Facultatif

Identifiant de clé. La valeur peut être n'importe quelle chaîne. Vous pouvez spécifier la valeur sous forme de valeur texte littérale, ou indirectement, via une référence de variable, avec l'attribut 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>

La règle inclut cet identifiant de clé en tant que revendication kid dans l'en-tête du jeton JWT généré.

Valeur (élément) Obligatoire

Clé secrète encodée. Spécifie la clé secrète utilisée pour signer la charge utile. Utilisez l'attribut ref pour fournir la clé indirectement via une variable, telle que private.secret-key.

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

Apigee applique un niveau de sécurité de clé minimal pour les algorithmes HS256/HS384/HS512. La longueur de clé minimale pour HS256 est de 32 octets, pour HS384 de 48 octets, et pour HS512 de 64 octets. L'utilisation d'une clé d'un niveau de sécurité inférieur entraîne une erreur d'exécution.

<Subject>

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

Exemple :

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

La stratégie génère un jeton JWT contenant une revendication sub, définie sur la valeur spécifiée. Cette revendication identifie le sujet du jeton JWT ou donne une instruction le concernant. Il s'agit de l'ensemble standard de revendications mentionné dans le document IETF RFC 7519.

Par défaut N/A
Presence Facultatif
Type Chaîne
Valeurs valides Toute valeur unique identifiant un sujet ou une variable de flux faisant référence à une valeur.

<Type>

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

Décrit si la règle génère un jeton JWT signé ou un jeton JWT chiffré. L'élément <Type> est facultatif. Vous pouvez l'utiliser pour informer les lecteurs de la configuration que la règle génère un jeton JWT signé ou chiffré.

  • Si l'élément <Type> est présent :
    • Si la valeur de <Type> est Signed, la règle génère un jeton JWT signé, et l'élément <Algorithm> doit être présent.
    • Si la valeur de <Type> est Encrypted, la règle génère un jeton JWT chiffré, et l'élément <Algorithms> doit être présent.
  • Si l'élément <Type> est absent :
    • Si l'élément <Algorithm> est présent, la règle suppose que <Type> est défini sur Signed.
    • Si l'élément <Algorithms> est présent, la règle suppose que <Type> est défini sur Encrypted.
  • Si ni <Algorithm>, ni <Algorithms> ne sont présents, la configuration n'est pas valide.
Par défaut N/A
Presence Facultatif
Type Chaîne
Valeurs valides Signed ou Encrypted

Variables de flux

La stratégie de génération d'un JWT ne définit pas de variables de flux.

Informations de référence sur les erreurs

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>