(V14.4.2)
La révocation de jetons JWT par le serveur de ressources (application exposant les webapis REST) est un élément de sécurisation.
Un jeton dont l'utilité est devenue caduque alors que sa durée de validité n'est pas révolue doit être révoqué. Ainsi il ne peut être utilisé pour s'authentifier malicieusement auprès d'un service.
L'opération de révocation est réalisée par le biais d'une requête explicite à une webapi dédiée.
Note/mise en garde : l'implémentation de la révocation des jetons par le serveur de ressources casse le paradigme d’une application stateless scalable. Les informations de révocation ne sont pas partageables entre deux instances de l'application.
1. Configuration de la gestion de révocation
La gestion de la révocation n'est pas active par défaut. Pour la rendre opérationnelle, il faut déclarer - dans le fichier Beans.xml - un bean de type JwtRevokeConfiguration
<bean id="jwtTokensRevocation" class="com.hardis.adelia.webservice.JwtRevokeConfiguration" init-method="loadTokensMap" destroy-method="saveTokensMap"> <property name="jwtClaimId" value="jti"/> <property name="jwtAuthSelfMode" value="true"/> <property name="jwtPurgeFrequencyTime" value="3600"/> </bean>
- jwtClaimId : nom du claim identifiant le jeton JWT. Valeur par défaut : "jti'
- jwtAuthSelfMode : activation de l'autorisation SelfMode. Une requête de révocation n'est autorisée que si l'identifiant du jeton à révoquer correspondant au jeton authentifiant la requête. Valeur par défaut : false.
- jwtPurgeFrequencyTime : Fréquence (en s) de purge de la table des jetons révoqués. Valeur par défaut : 3600.
Qui a le droit de révoquer un jeton ? - jwtAuthSelfMode=false : le jeton peut être révoqué par les utilisateurs portant un rôle particulier. Il faut déclarer une contrainte de sécurité spécifique [JwtSecurityConfiguration] pour le point d’accès de la demande de révocation <jaxrs_base_endpoint>/tokens/revocation.
- jwtAuthSelfMode=true : le jeton peut être révoqué uniquement par une requête authentifiée par ce même jeton. Ce contrôle vient toujours après le contrôle de l'appartenance à un rôle donné de l'utilisateur authentifié dès lors qu'une contrainte de sécurité est définie pour le endpoint de révocation.
Persistence de la table des jetons révoqués - La table des jetons révoqués subsiste à un redémarrage du serveur de ressources grâce aux méthodes d'initialisation et de terminaison du bean JwtRevokeConfiguration :
- init-method : loadTokenMaps
- destroy-method : saveTokensMaps
- La table des jetons révoquées est purgée à une fréquence donnée (par défaut toutes les heures). Les jetons purgés sont les jetons révoqués arrivés à expiration.
2. Webapis
Purpose | Api Endpoint | HTTP Verb | Payload | Response | Status |
Revocation by JwtId
| @Path("/tokens/revocation/{jwtId}") | @DELETE | - | true | 200 |
Revocation by token
| @Path("/tokens/revocation")
| @POST | Token | true | 200 |
Is a token revoked ?
| @Path("/tokens/revocation/{jwtId}")
| @GET | - | true
| 200 |
Revoked tokens list | @Path("/tokens/revocation/list")
| @GET | - | [ { "jwtId": "TokenId__FE706DC72E90060E9E88FB887ACB72E1_25_1619685311434", "revokedBy": "userName", "revocationRequestDate": "2021-04-29T08:35Z", "expirationDate": 1619688911 }, { "jwtId": "TokenId__FE706DC72E90060E9E88FB887ACB72E1_28_1619685265807", "revokedBy": "userName", "revocationRequestDate": "2021-04-29T08:35Z", "expirationDate": 1619688865 } ] | 200
|
HTTP Code :
Si l’opération aboutit : HTTP Code = 200
Si l’opération échoue car la requête de révocation n’est pas autorisée : HTTP Code = 403
Si le bean JwtRevokeConfiguration n’est pas déclaré (= révocation non active) ou si le jeton interrogé n’est pas trouvé : HTTP Code = 404.
Media-Type :
- @Consumes ('application/json')
- @Produces('application/json')