Esta página aplica-se ao Apigee e ao Apigee Hybrid.
Veja a documentação do
Apigee Edge.
O quê
Valida um JWT assinado ou desencripta e valida um JWT encriptado recebido de clientes ou outros sistemas. Esta política também extrai as reivindicações para variáveis de contexto, para que as políticas ou as condições subsequentes possam examinar esses valores para tomar decisões de autorização ou encaminhamento. Consulte a vista geral das políticas de JWS e JWT para uma introdução detalhada.
Esta política é uma política padrão e pode ser implementada em qualquer tipo de ambiente. Para obter informações sobre os tipos de políticas e a disponibilidade com cada tipo de ambiente, consulte Tipos de políticas.
Quando esta política é executada, no caso de um JWT assinado, o Apigee valida a assinatura do JWT através da chave de validação fornecida. No caso de um JWT encriptado, o Apigee desencripta o JWT com a chave de desencriptação. Em qualquer dos casos, o Apigee verifica posteriormente se o JWT é válido de acordo com as horas de validade e de início, se estiverem presentes. Opcionalmente, a política também pode validar os valores de reivindicações específicas no JWT, como o assunto, o emissor, o público-alvo ou o valor de reivindicações adicionais.
Se o JWT for validado e for válido, todas as reivindicações contidas no JWT são extraídas para variáveis de contexto para utilização por políticas ou condições subsequentes, e o pedido pode prosseguir. Se não for possível validar a assinatura JWT ou se o JWT for inválido devido a um dos registos de data/hora, todo o processamento é interrompido e é devolvido um erro na resposta.
Para saber mais sobre as partes de um JWT e como são encriptadas e assinadas, consulte o RFC7519.
Como
Se a política valida um JWT assinado ou encriptado, depende do elemento que usa para especificar o algoritmo que valida o JWT:
- Se usar o elemento
<Algorithm>
, a política valida um JWT assinado. - Se usar o elemento
<Algorithms>
, a política valida um JWT encriptado.
Vídeo
Veja um vídeo curto para saber como validar a assinatura num JWT.
Valide um JWT assinado
Esta secção explica como validar um JWT assinado. Para um JWT assinado,
use o elemento <Algorithm>
para especificar o algoritmo de assinatura da chave.
Exemplos de um JWT assinado
Os exemplos seguintes ilustram como validar um JWT assinado.
Algoritmo HS256
Esta política de exemplo valida um JWT que foi assinado com o algoritmo de encriptação HS256, HMAC
usando uma soma de verificação SHA-256. O JWT é transmitido no pedido de proxy através de um parâmetro de formulário denominado
jwt
. A chave está contida numa variável denominada private.secretkey
.
Consulte o vídeo acima para ver um exemplo completo, incluindo como fazer um pedido à política.
A configuração da política inclui as informações de que o Apigee precisa para descodificar e avaliar o JWT, como onde encontrar o JWT (numa variável de fluxo especificada no elemento Source), o algoritmo de assinatura necessário, onde encontrar a chave secreta (armazenada numa variável de fluxo do Apigee, que pode ter sido obtida do KVM do Apigee, por exemplo) e um conjunto de reivindicações necessárias e os respetivos valores.
<VerifyJWT name="JWT-Verify-HS256"> <DisplayName>JWT Verify HS256</DisplayName> <Algorithm>HS256</Algorithm> <Source>request.formparam.jwt</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <SecretKey encoding="base64"> <Value ref="private.secretkey"/> </SecretKey> <Subject>monty-pythons-flying-circus</Subject> <Issuer>urn://apigee-edge-JWT-policy-test</Issuer> <Audience>fans</Audience> <AdditionalClaims> <Claim name="show">And now for something completely different.</Claim> </AdditionalClaims> </VerifyJWT>
A política escreve o respetivo resultado em variáveis de contexto para que as políticas ou as condições subsequentes no proxy de API possam examinar esses valores. Consulte o artigo Variáveis de fluxo para ver uma lista das variáveis definidas por esta política.
Algoritmo RS256
Esta política de exemplo valida um JWT que foi assinado com o algoritmo RS256. Para validar,
tem de indicar a chave pública. O JWT é transmitido no pedido de proxy através de um parâmetro de formulário
denominado jwt
. A chave pública está contida numa variável denominada public.publickey
.
Consulte o vídeo acima para ver um exemplo completo, incluindo como fazer um pedido à política.
Consulte a Referência de elementos para ver detalhes sobre os requisitos e as opções de cada elemento nesta política de exemplo.
<VerifyJWT name="JWT-Verify-RS256"> <Algorithm>RS256</Algorithm> <Source>request.formparam.jwt</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <PublicKey> <Value ref="public.publickey"/> </PublicKey> <Subject>apigee-seattle-hatrack-montage</Subject> <Issuer>urn://apigee-edge-JWT-policy-test</Issuer> <Audience>urn://c60511c0-12a2-473c-80fd-42528eb65a6a</Audience> <AdditionalClaims> <Claim name="show">And now for something completely different.</Claim> </AdditionalClaims> </VerifyJWT>
Para a configuração acima, um JWT com este cabeçalho…
{ "typ" : "JWT", "alg" : "RS256" }
E esta carga útil…
{ "sub" : "apigee-seattle-hatrack-montage", "iss" : "urn://apigee-edge-JWT-policy-test", "aud" : "urn://c60511c0-12a2-473c-80fd-42528eb65a6a", "show": "And now for something completely different." }
… vai ser considerada válida se a assinatura puder ser validada com a chave pública fornecida.
Um JWT com o mesmo cabeçalho, mas com este payload…
{ "sub" : "monty-pythons-flying-circus", "iss" : "urn://apigee-edge-JWT-policy-test", "aud" : "urn://c60511c0-12a2-473c-80fd-42528eb65a6a", "show": "And now for something completely different." }
… vai ser considerada inválida, mesmo que seja possível validar a assinatura, porque a reivindicação "sub" incluída no JWT não corresponde ao valor necessário do elemento "Subject" conforme especificado na configuração da política.
A política escreve o respetivo resultado em variáveis de contexto para que as políticas ou as condições subsequentes no proxy de API possam examinar esses valores. Consulte o artigo Variáveis de fluxo para ver uma lista das variáveis definidas por esta política.
Os exemplos acima usam o elemento <Algorithm>
, pelo que validam um JWT assinado. O elemento <PrivateKey>
especifica a chave usada para assinar o JWT. Também existem outros elementos importantes. A que usar depende do algoritmo especificado pelo valor de <Algorithm>
, conforme descrito na secção seguinte.
Definir os elementos principais para validar um JWT assinado
Os seguintes elementos especificam a chave usada para validar um JWT assinado:
O elemento que usa depende do algoritmo escolhido, conforme apresentado na tabela seguinte:
Algoritmo | Elementos principais | |
---|---|---|
HS* |
<SecretKey encoding="base16|hex|base64|base64url"> <Value ref="private.secretkey"/> </SecretKey> |
|
RS*, ES*, PS* | <PublicKey> <Value ref="rsa_public_key_or_value"/> </PublicKey> ou: <PublicKey> <Certificate ref="signed_cert_val_ref"/> </PublicKey> ou: <PublicKey> <JWKS ref="jwks_val_or_ref"/> </PublicKey> |
|
*Para mais informações sobre os requisitos de chaves, consulte o artigo Acerca dos algoritmos de encriptação de assinaturas. |
Valide um JWT encriptado
Esta secção explica como validar um JWT encriptado. Para um JWT encriptado, use o elemento
<Algorithms>
para especificar os algoritmos de assinatura da chave e do conteúdo.
Exemplo de um JWT encriptado
O exemplo seguinte mostra como validar um JWT encriptado (com <Type>
definido como Encrypted
), em que:
- A chave está encriptada com o algoritmo RSA-OAEP-256.
- O conteúdo está encriptado com o algoritmo A128GCM.
<VerifyJWT name="vjwt-1"> <Algorithms> <Key>RSA-OAEP-256</Key> <Content>A128GCM</Content> </Algorithms> <Type>Encrypted</Type> <PrivateKey> <Value ref="private.rsa_privatekey"/> </PrivateKey> <Subject>subject@example.com</Subject> <Issuer>urn://apigee</Issuer> <AdditionalHeaders> <Claim name="moniker">Harvey</Claim> </AdditionalHeaders> <TimeAllowance>30s</TimeAllowance> <Source>input_var</Source> </VerifyJWT>
O exemplo acima usa o elemento <Algorithms>
, pelo que valida um JWT encriptado. O elemento <PrivateKey>
especifica a chave que vai ser usada para desencriptar o JWT. Também existem outros elementos importantes. A que usar depende do algoritmo especificado pelo valor de <Algorithms>
, conforme descrito na secção seguinte.
Definir os elementos principais para validar um JWT encriptado
Os seguintes elementos especificam a chave usada para validar um JWT encriptado:
O elemento que usa depende do algoritmo de encriptação de chaves escolhido, conforme mostrado na tabela seguinte:
Algoritmo | Elementos principais |
---|---|
RSA-OAEP-256 | <PrivateKey> <Value ref="private.rsa_privatekey"/> </PrivateKey> Nota: a variável que especificar tem de ser resolvida para uma chave privada RSA no formato codificado em PEM. |
|
<PrivateKey> <Value ref="private.ec_privatekey"/> </PrivateKey> Nota: a variável que especificar tem de ser resolvida para uma chave privada de curva elíptica no formato com codificação PEM. |
|
<SecretKey encoding="base16|hex|base64|base64url"> <Value ref="private.flow-variable-name-here"/> </SecretKey> |
|
<PasswordKey> <Value ref="private.password-key"/> <SaltLength> <PBKDF2Iterations> </PasswordKey> |
dir | <DirectKey> <Value encoding="base16|hex|base64|base64url" ref="private.directkey"/> </DirectKey> |
Para mais informações sobre os principais requisitos, consulte o artigo Acerca dos algoritmos de encriptação de assinatura.
Referência do elemento
A referência da política descreve os elementos e os atributos da política Verify JWT.
Nota: a configuração varia ligeiramente consoante o algoritmo de encriptação que usar. Consulte as amostras para ver exemplos que demonstram configurações para exemplos de utilização específicos.
Atributos que se aplicam ao elemento de nível superior
<VerifyJWT name="JWT" continueOnError="false" enabled="true" async="false">
Os seguintes atributos são comuns a todos os elementos principais da política.
Atributo | Descrição | Predefinição | Presença |
---|---|---|---|
nome |
O nome interno da política. Os carateres que pode usar no nome estão restritos a:
A-Z0-9._\-$ % . No entanto, a IU do Apigee aplica restrições adicionais, como a remoção automática de carateres que não sejam alfanuméricos.
Opcionalmente, use o elemento |
N/A | Obrigatória |
continueOnError |
Definido como false para devolver um erro quando uma política falha. Este comportamento é o esperado para a maioria das políticas.
Definido como |
falso | Opcional |
ativada |
Defina como true para aplicar a política.
Defina como |
verdadeiro | Opcional |
assíncrono | Este atributo foi descontinuado. | falso | Descontinuado |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
Use em conjunto com o atributo name para etiquetar a política no editor de proxy da IU de gestão com um nome diferente em linguagem natural.
Predefinição | Se omitir este elemento, é usado o valor do atributo name da política. |
Presença | Opcional |
Tipo | String |
<Algorithm>
<Algorithm>HS256</Algorithm>
Especifica o algoritmo criptográfico usado para validar o token. Use o elemento <Algorithm>
para validar um JWT assinado.
Os algoritmos RS*/PS*/ES* usam um par de chaves pública/secreta, enquanto os algoritmos HS* usam um segredo partilhado. Consulte também Acerca dos algoritmos de encriptação de assinaturas.
Pode especificar vários valores separados por vírgulas. Por exemplo, "HS256, HS512" ou "RS256, PS256". No entanto, não pode combinar algoritmos HS* com outros nem algoritmos ES* com outros, porque requerem um tipo de chave específico. Pode combinar algoritmos RS* e PS*.
Predefinição | N/A |
Presença | Obrigatória |
Tipo | String de valores separados por vírgulas |
Valores válidos | HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384 e PS512 |
<Algorithms>
<Algorithms> <Key>key-algorithm</Key> <Content>content-algorithm</Content> </Algorithm>
Use o elemento <Algorithms>
para validar um JWT encriptado. Este elemento
especifica o algoritmo criptográfico para a encriptação de chaves que tem de ter sido usado quando
o JWT encriptado foi criado. Também especifica opcionalmente o algoritmo
para a encriptação de conteúdo.
Predefinição | N/A |
Presença | Obrigatório quando valida um JWT encriptado |
Tipo | Complexo |
Elementos secundários de <Algorithms>
A tabela seguinte apresenta uma descrição geral dos elementos subordinados de
<Algorithms>
:
Elemento secundário | Obrigatório? | Descrição |
---|---|---|
<Key> |
Obrigatória | Especifica o algoritmo de encriptação da chave. |
<Content> |
Opcional | Especifica o algoritmo de encriptação do conteúdo. |
A validação falha se:
- O algoritmo declarado na propriedade
alg
no cabeçalho do JWT encriptado é diferente do algoritmo de encriptação de chaves especificado aqui no elemento<Key>
. -
A política especifica um elemento
<Content>
e o algoritmo afirmado na propriedadeenc
no cabeçalho do JWT encriptado é diferente do especificado no elemento<Content>
.
Por exemplo, para validar um JWT encriptado e verificar se o algoritmo da chave é RSA-OAEP-256
e se o algoritmo de conteúdo é A128GCM
:
<Algorithms> <Key>RSA-OAEP-256</Key> <Content>A128GCM</Content> </Algorithms>
Por outro lado, para validar um JWT encriptado e verificar se o algoritmo de chave é
RSA-OAEP-256
e não aplicar uma restrição ao algoritmo de conteúdo:
<Algorithms> <Key>RSA-OAEP-256</Key> </Algorithms>
Algoritmos de encriptação de chaves
A tabela seguinte apresenta os algoritmos disponíveis para a encriptação de chaves, bem como o tipo de chave que tem de especificar para validar um JWT através desse algoritmo de encriptação de chaves.
Valor de <Key> (algoritmo de encriptação de chaves) |
Elemento essencial necessário para a validação |
---|---|
dir | <DirectKey> |
RSA-OAEP-256 | <PrivateKey> |
|
<SecretKey> |
|
<PasswordKey> |
|
<PrivateKey> |
Consulte o artigo Validar um JWT encriptado para ver um exemplo em que o algoritmo de encriptação de chaves é RSA-OAEP-256
, pelo que usa o elemento <PrivateKey>
.
Algoritmos de encriptação de conteúdo
A política VerifyJWT não requer que especifique um algoritmo para a encriptação de conteúdo. Se quiser especificar o algoritmo usado para a encriptação de conteúdo, faça-o com o elemento filho<Content> do elemento <Algorithms>.
Independentemente do algoritmo de encriptação de chaves, os seguintes algoritmos, todos simétricos e baseados em AES, são suportados para a encriptação de conteúdo:
- A128CBC-HS256
- A192CBC-HS384
- A256CBC-HS512
- A128GCM
- A192GCM
- A256GCM
<Audience>
<Audience>audience-here</Audience> or: <Audience ref='variable-name-here'/>
A política verifica se a reivindicação de público no JWT corresponde ao valor especificado na configuração. Se não existir uma correspondência, a política gera um erro. Esta reivindicação identifica os destinatários a quem o JWT se destina. Esta é uma das reivindicações registadas mencionadas na RFC7519.
Predefinição | N/A |
Presença | Opcional |
Tipo | String |
Valores válidos | Uma variável ou uma string de fluxo que identifica o público-alvo. |
<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'/>
Valida se a carga útil do JWT contém as reivindicações adicionais especificadas e se os valores das reivindicações afirmadas correspondem.
Uma reivindicação adicional usa um nome que não é um dos nomes de reivindicações JWT padrão e registados. O valor de uma reivindicação adicional pode ser uma string, um número, um valor booleano, um mapa ou uma matriz. Um mapa é simplesmente um conjunto de pares de nome/valor. O valor de uma reivindicação de qualquer um destes tipos pode ser especificado explicitamente na configuração da política ou indiretamente através de uma referência a uma variável de fluxo.
Predefinição | N/A |
Presença | Opcional |
Tipo | String, número, booleano ou mapa |
Array | Defina como true para indicar se o valor é uma matriz de tipos. Predefinição: false |
Valores válidos | Qualquer valor que queira usar para uma reivindicação adicional. |
O elemento <Claim>
aceita os seguintes atributos:
- name: (obrigatório) o nome da reivindicação.
- ref: (opcional) o nome de uma variável de fluxo. Se estiver presente, a política usa o valor desta variável como a reivindicação. Se forem especificados um atributo ref e um valor de reivindicação explícito, o valor explícito é o predefinido e é usado se a variável de fluxo referenciada não for resolvida.
- type: (opcional) um dos seguintes: string (predefinição), number, boolean ou map
- array: (opcional) defina como verdadeiro para indicar se o valor é uma matriz de tipos. Predefinição: false.
Quando inclui o elemento <Claim>
, os nomes das reivindicações são definidos estaticamente quando
configura a política. Em alternativa, pode transmitir um objeto JSON para especificar os nomes das reivindicações.
Uma vez que o objeto JSON é transmitido como uma variável, os nomes das reivindicações são determinados no momento da execução.
Por exemplo:
<AdditionalClaims ref='json_claims'/>
Em que a variável json_claims
contém um objeto JSON no 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 } } }
<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>
Valida se o cabeçalho JWT contém os pares de nome/valor de reivindicação adicionais especificados e se os valores de reivindicação afirmados correspondem.
Uma reivindicação adicional usa um nome que não é um dos nomes de reivindicações JWT padrão e registados. O valor de uma reivindicação adicional pode ser uma string, um número, um valor booleano, um mapa ou uma matriz. Um mapa é simplesmente um conjunto de pares de nome/valor. O valor de uma reivindicação de qualquer um destes tipos pode ser especificado explicitamente na configuração da política ou indiretamente através de uma referência a uma variável de fluxo.
Predefinição | N/A |
Presença | Opcional |
Tipo |
String (predefinição), número, booleano ou mapa. O tipo é predefinido como String se não for especificado nenhum tipo. |
Array | Defina como true para indicar se o valor é uma matriz de tipos. Predefinição: false |
Valores válidos | Qualquer valor que queira usar para uma reivindicação adicional. |
O elemento <Claim>
aceita os seguintes atributos:
- name: (obrigatório) o nome da reivindicação.
- ref: (opcional) o nome de uma variável de fluxo. Se estiver presente, a política usa o valor desta variável como a reivindicação. Se forem especificados um atributo ref e um valor de reivindicação explícito, o valor explícito é o predefinido e é usado se a variável de fluxo referenciada não for resolvida.
- type: (opcional) um dos seguintes: string (predefinição), number, boolean ou map
- array: (opcional) defina como verdadeiro para indicar se o valor é uma matriz de tipos. Predefinição: false.
<CustomClaims>
Nota: atualmente, é inserido um elemento CustomClaims quando adiciona uma nova política GenerateJWT através da IU. Este elemento não é funcional e é ignorado. O elemento correto a usar é <AdditionalClaims>. A IU vai ser atualizada para inserir os elementos corretos mais tarde.
<Id>
<Id>explicit-jti-value-here</Id> -or- <Id ref='variable-name-here'/> -or- <Id/>
Verifica se o JWT tem a reivindicação jti específica. Quando o valor de texto e o atributo ref estão ambos vazios, a política gera um jti que contém um UUID aleatório. A reivindicação de ID do JWT (jti) é um identificador exclusivo do JWT. Para mais informações sobre jti, consulte o RFC7519.
Predefinição | N/A |
Presença | Opcional |
Tipo | String ou referência. |
Valores válidos | Uma string ou o nome de uma variável de fluxo que contém o ID. |
<IgnoreCriticalHeaders>
<IgnoreCriticalHeaders>true|false</IgnoreCriticalHeaders>
Defina como falso se quiser que a política apresente um erro quando qualquer cabeçalho listado no cabeçalho crit do JWT não estiver listado no elemento <KnownHeaders>
.
Defina como verdadeiro para fazer com que a política VerifyJWT ignore o cabeçalho crit.
Um dos motivos para definir este elemento como verdadeiro é se estiver num ambiente de teste e ainda não estiver preparado para processar uma falha num cabeçalho em falta.
Predefinição | falso |
Presença | Opcional |
Tipo | Booleano |
Valores válidos | verdadeiro ou falso |
<IgnoreIssuedAt>
<IgnoreIssuedAt>true|false</IgnoreIssuedAt>
Defina como falso (predefinição) se quiser que a política apresente um erro quando um JWT contém uma reivindicação iat
(Emitido em) que especifica uma hora no futuro.
Defina como verdadeiro para fazer com que a política ignore o iat
durante a validação.
Predefinição | falso |
Presença | Opcional |
Tipo | Booleano |
Valores válidos | verdadeiro ou falso |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
Defina como falso se quiser que a política apresente um erro quando qualquer variável referenciada especificada na política não for resolúvel. Defina como verdadeiro para tratar qualquer variável não resolúvel como uma string vazia (nula).
Predefinição | falso |
Presença | Opcional |
Tipo | Booleano |
Valores válidos | verdadeiro ou falso |
<Issuer>
<VerifyJWT name='VJWT-29'> ... <!-- verify that the iss claim matches a hard-coded value --> <Issuer>issuer-string-here</Issuer> or: <!-- verify that the iss claim matches the value contained in a variable --> <Issuer ref='variable-containing-issuer'/> or: <!-- verify via a variable; fallback to a hard-coded value if the variable is empty --> <Issuer ref='variable-containing-issuer'>fallback-value-here</Issuer>
A política verifica se o emissor no JWT (a reivindicação iss
) corresponde à string
especificada no elemento de configuração. A reivindicação iss
é uma das reivindicações registadas
mencionadas na RFC 7519 da IETF.
Predefinição | N/A |
Presença | Opcional |
Tipo | String ou referência |
Valores válidos | Qualquer |
<KnownHeaders>
<KnownHeaders>a,b,c</KnownHeaders> or: <KnownHeaders ref='variable_containing_headers'/>
A política GenerateJWT usa o elemento <CriticalHeaders>
para preencher o cabeçalho
crit num JWT. Por exemplo:
{ "typ": "...", "alg" : "...", "crit" : [ "a", "b", "c" ], }
A política VerifyJWT examina o cabeçalho crit no JWT, se existir, e, para cada cabeçalho listado, verifica se o elemento <KnownHeaders>
também lista esse cabeçalho. O elemento <KnownHeaders>
pode conter um superconjunto dos itens listados em crit.
Só é necessário que todos os cabeçalhos indicados em crit estejam indicados no elemento
<KnownHeaders>
. Qualquer cabeçalho que a política encontre em crit
que também não esteja listado em <KnownHeaders>
faz com que a política VerifyJWT falhe.
Opcionalmente, pode configurar a política VerifyJWT para ignorar o cabeçalho crit definindo o elemento <IgnoreCriticalHeaders>
como true
.
Predefinição | N/A |
Presença | Opcional |
Tipo | Matriz de strings separadas por vírgulas |
Valores válidos | Uma matriz ou o nome de uma variável que contém a matriz. |
<MaxLifespan>
<VerifyJWT name='VJWT-62'> ... <!-- hard-coded lifespan of 5 minutes --> <MaxLifespan>5m</MaxLifespan> or: <!-- refer to a variable --> <MaxLifespan ref='variable-here'/> or: <!-- attribute telling the policy to use iat rather than nbf --> <MaxLifespan useIssueTime='true'>1h</MaxLifespan> or: <!-- useIssueTime and ref, and hard-coded fallback value. --> <MaxLifespan useIssueTime='true' ref='variable-here'>1h</MaxLifespan> ...
Configura a política VerifyJWT para verificar se a duração de um token não excede um limite especificado. Pode especificar o limite usando um número seguido de um caráter, que indica o número de segundos, minutos, horas, dias ou semanas. Os seguintes carateres são válidos:
s
- segundosm
minutosh
- horasd
- diasw
- semanas
Por exemplo, pode especificar um dos seguintes valores: 120s, 10m, 1h, 7d, 3w.
A política calcula a duração real do token subtraindo o valor not-before (nbf)
do valor de validade (exp)
. Se
exp
ou nbf
estiver em falta, a política gera uma falha. Se a duração do token exceder o período especificado, a política gera uma falha.
Pode definir o atributo opcional useIssueTime
como true
para usar o valor iat
em vez do valor nbf
ao calcular a duração do token.
A utilização do elemento MaxLifespan
é opcional. Se usar este elemento, só o pode usar uma vez.
<PrivateKey>
Use este elemento para especificar a chave privada que pode ser usada para validar um JWT encriptado com um algoritmo assimétrico. Segue-se uma descrição dos possíveis elementos subordinados.
<Password>
<PrivateKey> <Password ref="private.privatekey-password"/> </PrivateKey>
Um elemento secundário do elemento <PrivateKey>
. Especifica a palavra-passe que a política deve usar para desencriptar a chave privada, se necessário, ao validar um JWT encriptado.
Use o atributo ref
para transmitir a palavra-passe numa variável de fluxo.
Predefinição | N/A |
Presença | Opcional |
Tipo | String |
Valores válidos |
Uma referência de variável de fluxo.
Nota: tem de especificar uma variável de fluxo. O Apigee rejeita como inválida uma configuração de política em que a palavra-passe é especificada em texto simples. A variável de fluxo
tem de ter o prefixo "private". Por exemplo, |
<Value>
<PrivateKey> <Value ref="private.variable-name-here"/> </PrivateKey>
Elemento secundário do elemento <PrivateKey>
. Especifica uma chave privada codificada em PEM
que a política vai usar para validar um JWT encriptado. Use o atributo ref
para transmitir a chave
numa variável de fluxo.
Predefinição | N/A |
Presença | Necessário para validar um JWT que foi encriptado com um algoritmo de encriptação de chaves assimétricas. |
Tipo | String |
Valores válidos |
Uma variável de fluxo que contém uma string que representa um valor de chave privada RSA codificado em PEM.
Nota: a variável de fluxo tem de ter o prefixo "private". Por exemplo,
|
<PublicKey>
Especifica a origem da chave pública usada para validar um JWT assinado com um algoritmo assimétrico. Os algoritmos suportados incluem: RS256/RS384/RS512, PS256/PS384/PS512 ou ES256/ES384/ES512. Segue-se uma descrição dos possíveis elementos subordinados.
<Certificate>
<PublicKey> <Certificate ref="signed_public.cert"/> </PublicKey> -or- <PublicKey> <Certificate> -----BEGIN CERTIFICATE----- certificate data -----END CERTIFICATE----- </Certificate> </PublicKey>
Um elemento secundário do elemento <PublicKey>
. Especifica o certificado assinado
usado como a origem da chave pública. Use o atributo ref
para transmitir o certificado assinado numa variável de fluxo ou especifique o certificado codificado em PEM
diretamente. Certifique-se de que alinha os dados do certificado à esquerda, conforme mostrado
no exemplo de referência.
Predefinição | N/A |
Presença | Opcional. Para validar um JWT assinado com um algoritmo assimétrico, tem de usar o elemento <Certificate> , o elemento <JWKS> ou o elemento <Value> para fornecer a chave pública. |
Tipo | String |
Valores válidos | Uma variável de fluxo ou uma string. |
<JWKS>
<PublicKey> <JWKS … > … </JWKS> </PublicKey>
Um elemento secundário do elemento <PublicKey>
. Especifica um JWKS como uma origem de chaves públicas. Esta será uma lista de chaves seguindo o formato descrito no documento
IETF RFC 7517 – Chave Web JSON (JWK).
Se o JWT de entrada tiver um ID da chave presente no JWKS, a política usa a chave pública correta para validar a assinatura do JWT. Para ver detalhes acerca desta funcionalidade, consulte o artigo Usar um conjunto de chaves Web JSON (JWKS) para validar um JWT.
Se obtiver o valor de um URL público, o Apigee armazena em cache o JWKS durante um período de 300 segundos. Quando a cache expira, o Apigee obtém novamente o JWKS.
Predefinição | N/A |
Presença | Opcional. Para validar um JWT assinado com um algoritmo assimétrico, tem de usar o elemento <Certificate> , o elemento <JWKS> ou o elemento <Value> para fornecer a chave pública. |
Tipo | String |
Valores válidos |
Pode especificar o JWKS de uma das quatro formas seguintes:
|
<Value>
<PublicKey> <Value ref="public.publickeyorcert"/> </PublicKey> -or- <PublicKey> <Value> -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw2kPrRzcufvUNHvTH/WW ...YOUR PUBLIC KEY MATERIAL HERE....d1lH8MfUyRXmpmnNxJHAC2F73IyN ZmkDb/DRW5onclGzxQITBFP3S6JXd4LNESJcTp705ec1cQ9Wp2Kl+nKrKyv1E5Xx DQIDAQAB -----END PUBLIC KEY----- </Value> </PublicKey>
Um elemento secundário do elemento <PublicKey>
. Especifica a chave pública a usar para validar a assinatura num JWT assinado. Use o atributo ref
para transmitir a chave
numa variável de fluxo ou especifique a chave codificada em PEM diretamente. Certifique-se de que alinha a chave pública à esquerda, conforme mostrado no exemplo de referência.
Predefinição | N/A |
Presença | Opcional. Para validar um JWT assinado com um algoritmo assimétrico, tem de usar o elemento <Certificate> , o elemento <JWKS> ou o elemento <Value> para fornecer a chave pública. |
Tipo | String |
Valores válidos | Uma variável de fluxo ou uma string. |
<RequiredClaims>
<VerifyJWT name='VJWT-1'> ... <!-- Directly specify the names of the claims to require --> <RequiredClaims>sub,iss,exp</RequiredClaims> -or- <!-- Specify the claim names indirectly, via a context variable --> <RequiredClaims ref='claims_to_require'/> ... </VerifyJWT>
O elemento <RequiredClaims>
é opcional. Especifica uma lista de nomes separados por vírgulas
de reivindicações que têm de estar presentes na carga útil do JWT quando se valida um JWT. O elemento
garante que o JWT apresentado contém as reivindicações necessárias, mas não valida o conteúdo
das reivindicações. Se alguma das reivindicações indicadas não estiver presente, a política VerifyJWT gera uma falha em tempo de execução.
Predefinição | N/A |
Presença | Opcional |
Tipo | String |
Valores válidos | Uma lista de nomes de reivindicações separados por vírgulas. |
<SecretKey>
<SecretKey encoding="base16|hex|base64|base64url" > <Value ref="private.your-variable-name"/> </SecretKey>
O elemento SecretKey é opcional. Especifica a chave secreta a usar quando validar um JWT assinado que usa um algoritmo simétrico (HS*) ou quando validar um JWT encriptado que usa um algoritmo simétrico (AES) para a encriptação de chaves.
Filhos de <SecretKey>
A tabela seguinte fornece uma descrição dos elementos e atributos secundários de
<SecretKey>
:
Filho | Presença | Descrição |
---|---|---|
codificação (atributo) | Opcional | Especifica como a chave é codificada na variável referenciada. Por predefinição, quando não está presente o atributo
<SecretKey encoding="hex" > <Value ref="private.secretkey"/> </SecretKey> No exemplo acima, uma vez que a codificação é |
Valor (elemento) | Obrigatória | Uma chave secreta codificada. Especifica a chave secreta que vai ser usada
para validar a carga útil. Use o atributo <SecretKey> <Value ref="private.my-secret-variable"/> </SecretKey> O Apigee aplica uma intensidade mínima da chave para os algoritmos HS256/HS384/HS512. O comprimento mínimo da chave para HS256 é de 32 bytes, para HS384 é de 48 bytes e para HS512 é de 64 bytes. A utilização de uma chave de menor intensidade provoca um erro de tempo de execução. |
<Source>
<Source>jwt-variable</Source>
Se presente, especifica a variável de fluxo na qual a política espera encontrar o JWT para validar.
Com este elemento, pode configurar a política para obter o JWT de um formulário ou de uma variável de parâmetro de consulta ou qualquer outra variável. Quando este elemento está presente, a política não remove nenhum prefixo Bearer
que possa estar presente. Se a variável não existir ou se a política não encontrar um JWT na variável especificada, a política devolve um erro.
Por predefinição, quando não está presente nenhum elemento <Source>
, a política obtém o JWT lendo a variável request.header.authorization
e removendo o prefixo Bearer
. Se transmitir o JWT no cabeçalho de autorização como um token de portador
(com o prefixo Bearer
), não especifique o elemento <Source>
na configuração da política. Por exemplo, não usaria nenhum elemento <Source>
na configuração da política se transmitisse o JWT no cabeçalho de autorização da seguinte forma:
curl -v https://api-endpoint/proxy1_basepath/api1 -H "Authorization: Bearer eyJhbGciOiJ..."
Predefinição | request.header.authorization (Consulte a nota acima para ver informações importantes
acerca da predefinição). |
Presença | Opcional |
Tipo | String |
Valores válidos | Um nome de variável de fluxo do Apigee. |
<Subject>
<VerifyJWT name='VJWT-8'> ... <!-- verify that the sub claim matches a hard-coded value --> <Subject>subject-string-here</Subject> or: <!-- verify that the sub claim matches the value contained in a variable --> <Subject ref='variable-containing-subject'/> or: <!-- verify via a variable; fallback to a hard-coded value if the variable is empty --> <Subject ref='variable-containing-subject'>fallback-value-here</Subject>
A política verifica se o assunto no JWT (a reivindicação sub
) corresponde à string
especificada na configuração da política. A reivindicação sub
é uma das reivindicações registadas descritas na RFC7519.
Predefinição | N/A |
Presença | Opcional |
Tipo | String |
Valores válidos | Qualquer valor que identifique exclusivamente um assunto. |
<TimeAllowance>
<VerifyJWT name='VJWT-23'> ... <!-- configure a hard-coded time allowance of 20 seconds --> <TimeAllowance>20s</TimeAllowance> or: <!-- refer to a variable containing the time allowance --> <TimeAllowance ref='variable-containing-time-allowance'/> or: <!-- refer to a variable; fallback to a hard-coded value if the variable is empty --> <TimeAllowance ref='variable-containing-allowance'>30s</TimeAllowance>
O "período de tolerância" para horas, para ter em conta a diferença de tempo entre o emissor e o validador de um JWT. Isto aplica-se tanto à data de validade (a reivindicação exp
) como ao
not-before-time (a reivindicação nbf
). Por exemplo, se o tempo permitido estiver configurado
para 30s
, um JWT expirado é tratado como ainda válido durante 30 segundos
após a validade declarada. O not-before-time é avaliado de forma semelhante.
Predefinição | 0 segundos (sem período de tolerância) |
Presença | Opcional |
Tipo | String |
Valores válidos |
Uma expressão de intervalo de tempo ou uma referência a uma variável de fluxo que contém uma expressão.
Os intervalos de tempo podem ser especificados por um número inteiro positivo seguido de um caráter que indica
uma unidade de tempo, da seguinte forma:
|
<Type>
<Type>type-string-here</Type>
Descreve se a política valida um JWT assinado ou um JWT encriptado.
O elemento <Type>
é opcional. Pode usá-lo para informar os leitores da configuração se a política gera um JWT assinado ou encriptado.
- Se o elemento
<Type>
estiver presente:- Se o valor de
<Type>
forSigned
, a política valida um JWT assinado e o elemento<Algorithm>
tem de estar presente. - Se o valor de
<Type>
forEncrypted
, a política valida um JWT encriptado e o elemento<Algorithms>
tem de estar presente.
- Se o valor de
- Se o elemento
<Type>
estiver ausente:- Se o elemento
<Algorithm>
estiver presente, a política assume que<Type>
éSigned
. - Se o elemento
<Algorithms>
estiver presente, a política assume que<Type>
éEncrypted
.
- Se o elemento
- Se não estiver presente nem
<Algorithm>
nem<Algorithms>
, a configuração é inválida.
Predefinição | N/A |
Presença | Opcional |
Tipo | String |
Valores válidos | Signed ou Encrypted |
Variáveis de fluxo
Após o êxito, as políticas Verify JWT e Decode JWT definem variáveis de contexto de acordo com este padrão:
jwt.{policy_name}.{variable_name}
Por exemplo, se o nome da política for jwt-parse-token
, a política armazena o assunto especificado no JWT na variável de contexto denominada jwt.jwt-parse-token.decoded.claim.sub
.
(Para retrocompatibilidade, também estará disponível em jwt.jwt-parse-token.claim.subject
)
Nome da variável | Descrição |
---|---|
claim.audience |
A reivindicação de público do JWT. Este valor pode ser uma string ou uma matriz de strings. |
claim.expiry |
A data/hora de validade, expressa em milissegundos desde a época. |
claim.issuedat |
A data em que o token foi emitido, expressa em milissegundos desde epoch. |
claim.issuer |
A reivindicação do emissor do JWT. |
claim.notbefore |
Se o JWT incluir uma reivindicação nbf, esta variável vai conter o valor, expresso em milissegundos desde a época. |
claim.subject |
A reivindicação de assunto do JWT. |
claim.name |
O valor da reivindicação com nome (padrão ou adicional) na carga útil. Um destes valores vai ser definido para cada reclamação no payload. |
decoded.claim.name |
O valor analisável em JSON da reivindicação com nome (padrão ou adicional) na carga útil. Uma variável é definida para cada reivindicação na carga útil. Por exemplo, pode usar decoded.claim.iat para
obter a hora de emissão do JWT, expressa em segundos desde a época. Embora também possa usar as variáveis de fluxo claim.name , esta é a variável recomendada para usar para aceder a uma reivindicação. |
decoded.header.name |
O valor analisável em JSON de um cabeçalho no payload. É definida uma variável para cada cabeçalho na carga útil. Embora também possa usar as header.name variáveis de fluxo,
esta é a variável recomendada para usar para aceder a um cabeçalho. |
expiry_formatted |
A data/hora de validade, formatada como uma string legível. Exemplo: 2017-09-28T21:30:45.000+0000 |
header.algorithm |
O algoritmo de assinatura usado no JWT. Por exemplo, RS256, HS384, etc. Consulte o parâmetro de cabeçalho(algoritmo) para mais informações. |
header.kid |
O ID da chave, se tiver sido adicionado quando o JWT foi gerado. Consulte também "Usar um conjunto de chaves Web JSON (JWKS)" na vista geral das políticas JWT para validar um JWT. Consulte o parâmetro do cabeçalho(ID da chave) para mais informações. |
header.type |
Vai ser definido como JWT . |
header.name |
O valor do cabeçalho com nome (padrão ou adicional). Um destes será definido para cada cabeçalho adicional na parte do cabeçalho do JWT. |
header-json |
O cabeçalho no formato JSON. |
is_expired |
verdadeiro ou falso |
payload-claim-names |
Uma matriz de reivindicações suportadas pelo JWT. |
payload-json |
O payload no formato JSON.
|
seconds_remaining |
O número de segundos antes de o token expirar. Se o token tiver expirado, este número é negativo. |
time_remaining_formatted |
O tempo restante antes de o token expirar, formatado como uma string legível. Exemplo: 00:59:59.926 |
valid |
No caso de VerifyJWT, esta variável é verdadeira quando a assinatura é validada e a hora atual é anterior à data de validade do token e posterior ao valor notBefore do token, se estiverem presentes. Caso contrário, devolve false.
No caso de DecodeJWT, esta variável não está definida. |
Referência de erro
Esta secção descreve os códigos de falha e as mensagens de erro devolvidas, bem como as variáveis de falha definidas pelo Apigee quando esta política aciona um erro. É importante conhecer estas informações se estiver a desenvolver regras de falhas para tratar falhas. Para saber mais, consulte o artigo O que precisa de saber acerca dos erros de políticas e Como processar falhas.
Erros de tempo de execução
Estes erros podem ocorrer quando a política é executada.
Código de falha | Estado de HTTP | Ocorre quando |
---|---|---|
steps.jwt.AlgorithmInTokenNotPresentInConfiguration |
401 |
Ocorre quando a política de validação tem vários algoritmos. |
steps.jwt.AlgorithmMismatch |
401 |
O algoritmo especificado na política Generate não correspondeu ao esperado na política Verify . Os algoritmos especificados têm de corresponder. |
steps.jwt.FailedToDecode |
401 |
A política não conseguiu descodificar o JWT. O JWT está possivelmente danificado. |
steps.jwt.GenerationFailed |
401 |
A política não conseguiu gerar o JWT. |
steps.jwt.InsufficientKeyLength |
401 |
Para uma chave inferior a 32 bytes para o algoritmo HS256, inferior a 48 bytes para o algoritmo HS386 e inferior a 64 bytes para o algoritmo HS512. |
steps.jwt.InvalidClaim |
401 |
Para uma reivindicação em falta ou uma incompatibilidade de reivindicação, ou um cabeçalho em falta ou uma incompatibilidade de cabeçalho. |
steps.jwt.InvalidConfiguration |
401 |
Os elementos <Algorithm> e <Algorithms> estão presentes. |
steps.jwt.InvalidCurve |
401 |
A curva especificada pela chave não é válida para o algoritmo de curva elíptica. |
steps.jwt.InvalidIterationCount |
401 |
A contagem de iterações usada no JWT encriptado não é igual à contagem de iterações especificada na configuração da política VerifyJWT. Isto aplica-se apenas a JWTs que
usam <PasswordKey> . |
steps.jwt.InvalidJsonFormat |
401 |
Foi encontrado JSON inválido no cabeçalho ou no payload. |
steps.jwt.InvalidKeyConfiguration |
401 |
O elemento JWKS no elemento <PublicKey> é inválido. O motivo
pode ser que o ponto final do URI de JWKS não seja acessível a partir da instância do Apigee. Teste a
conetividade ao ponto final criando um proxy de passagem e usando o ponto final JWKS
como destino. |
steps.jwt.InvalidSaltLength |
401 |
O comprimento do sal usado no JWT encriptado não é igual ao comprimento do sal
especificado na configuração da política VerifyJWT. Isto aplica-se apenas a JWTs que
usam <PasswordKey> . |
steps.jwt.InvalidPasswordKey |
401 |
A chave especificada não cumpriu os requisitos. |
steps.jwt.InvalidPrivateKey |
401 |
A chave especificada não cumpriu os requisitos. |
steps.jwt.InvalidPublicKey |
401 |
A chave especificada não cumpriu os requisitos. |
steps.jwt.InvalidSecretKey |
401 |
A chave especificada não cumpriu os requisitos. |
steps.jwt.InvalidToken |
401 |
Este erro ocorre quando a validação da assinatura JWT falha. |
steps.jwt.JwtAudienceMismatch |
401 |
A reivindicação de público-alvo falhou na validação do token. |
steps.jwt.JwtIssuerMismatch |
401 |
A reivindicação do emissor falhou na validação do token. |
steps.jwt.JwtSubjectMismatch |
401 |
A reivindicação do assunto falhou na validação do token. |
steps.jwt.KeyIdMissing |
401 |
A política Verify usa um JWKS como origem para chaves públicas, mas o JWT assinado não
inclui uma propriedade kid no cabeçalho. |
steps.jwt.KeyParsingFailed |
401 |
Não foi possível analisar a chave pública a partir das informações da chave fornecidas. |
steps.jwt.NoAlgorithmFoundInHeader |
401 |
Ocorre quando o JWT não contém um cabeçalho de algoritmo. |
steps.jwt.NoMatchingPublicKey |
401 |
A política Verify usa um JWKS como origem para chaves públicas, mas o kid
no JWT assinado não está listado no JWKS. |
steps.jwt.SigningFailed |
401 |
Em GenerateJWT, para uma chave inferior ao tamanho mínimo para os algoritmos HS384 ou HS512 |
steps.jwt.TokenExpired |
401 |
A política tenta validar um token expirado. |
steps.jwt.TokenNotYetValid |
401 |
O token ainda não é válido. |
steps.jwt.UnhandledCriticalHeader |
401 |
Um cabeçalho encontrado pela política Verify JWT no cabeçalho crit não está
listado em KnownHeaders . |
steps.jwt.UnknownException |
401 |
Ocorreu uma exceção desconhecida. |
steps.jwt.WrongKeyType |
401 |
Foi especificado o tipo de chave errado. Por exemplo, se especificar uma chave RSA para um algoritmo de curva elíptica ou uma chave de curva para um algoritmo RSA. |
Erros de implementação
Estes erros podem ocorrer quando implementa um proxy que contém esta política.
Nome do erro | Causa | Corrigir |
---|---|---|
InvalidNameForAdditionalClaim |
A implementação falha se a reivindicação usada no elemento filho <Claim>
do elemento <AdditionalClaims> for um dos seguintes nomes registados:
kid , iss , sub , aud , iat ,
exp , nbf ou jti .
|
build |
InvalidTypeForAdditionalClaim |
Se a reivindicação usada no elemento subordinado <Claim>
do elemento <AdditionalClaims> não for do tipo string , number ,
boolean ou map , a implementação falha.
|
build |
MissingNameForAdditionalClaim |
Se o nome da reivindicação não for especificado no elemento secundário <Claim>
do elemento <AdditionalClaims> , a implementação falha.
|
build |
InvalidNameForAdditionalHeader |
Este erro ocorre quando o nome da reivindicação usado no elemento filho <Claim>
do elemento <AdditionalClaims> é alg ou typ .
|
build |
InvalidTypeForAdditionalHeader |
Se o tipo de reivindicação usado no elemento subordinado <Claim>
do elemento <AdditionalClaims> não for do tipo string , number ,
boolean ou map , a implementação falha.
|
build |
InvalidValueOfArrayAttribute |
Este erro ocorre quando o valor do atributo de matriz no elemento subordinado <Claim>
do elemento <AdditionalClaims> não está definido como true ou false .
|
build |
InvalidValueForElement |
Se o valor especificado no elemento <Algorithm> não for um valor suportado,
a implementação falha.
|
build |
MissingConfigurationElement |
Este erro ocorre se o elemento <PrivateKey> não for usado com algoritmos da família RSA ou se o elemento <SecretKey> não for usado com algoritmos da família HS.
|
build |
InvalidKeyConfiguration |
Se o elemento subordinado <Value> não estiver definido nos elementos <PrivateKey>
ou <SecretKey> , a implementação falha.
|
build |
EmptyElementForKeyConfiguration |
Se o atributo ref do elemento secundário <Value> dos elementos <PrivateKey>
ou <SecretKey> estiver vazio ou não especificado, a implementação falha.
|
build |
InvalidConfigurationForVerify |
Este erro ocorre se o elemento <Id> estiver definido no elemento
<SecretKey> .
|
build |
InvalidEmptyElement |
Este erro ocorre se o elemento <Source> da política Verify JWT estiver vazio. Se estiver presente, tem de ser definido com um nome de variável de fluxo do Apigee.
|
build |
InvalidPublicKeyValue |
Se o valor usado no elemento secundário <JWKS> do elemento <PublicKey> não usar um formato válido, conforme especificado na RFC 7517, a implementação falha.
|
build |
InvalidConfigurationForActionAndAlgorithm |
Se o elemento <PrivateKey> for usado com algoritmos da família HS ou o elemento <SecretKey> for usado com algoritmos da família RSA, a implementação falha.
|
build |
Variáveis de falha
Estas variáveis são definidas quando ocorre um erro de tempo de execução. Para mais informações, consulte o artigo O que precisa de saber acerca dos erros de políticas.
Variáveis | Onde | Exemplo |
---|---|---|
fault.name="fault_name" |
fault_name é o nome da falha, conforme indicado na tabela Erros de tempo de execução acima. O nome da falha é a última parte do código de falha. | fault.name Matches "InvalidToken" |
JWT.failed |
Todas as políticas de JWT definem a mesma variável em caso de falha. | JWT.failed = true |
Exemplo de resposta de erro
Para o processamento de erros, a prática recomendada é captar a parte errorcode
da resposta de erro. Não confie no texto em faultstring
, porque pode mudar.
Exemplo de regra de falha
<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>