Lorsque l'utilisateur a été authentifié avec succès par le (ou les) modules d'authentification, le service doit créer un jeton JWT et le retourner à l'émetteur de la requête.
Le jeton intègre, via des attributs nommés claims, différentes informations.
Certaines sont issues du module d'authentification :
Nom du claim |
Commentaire |
sub (subject) |
Contient le nom de l'utilisateur authentifié. |
claimName |
Le module d'authentification LDAP permet d'associer une valeur d'attribut de l'utilisateur authentifié à un nom de claim [claimName]. |
Le jeton intègre également des informations définies par l'objet JwtProviderConfig décrit dans le fichier de configuration /WEB-INF/beans.xml.
<bean id="jwtProviderConfig" class="com.hardis.jwtprovider.JwtProviderConfig"> <property name="jwtUserRoleClaim" value="roles"/> <!-- iat | nbf | exp --> <property name="jwtValidityTimeClaim" value="iat"/> <!--property name="jwtTtl" value="3600"/--> <property name="jwtIssuer" value="jwtProvider/hardis-group.com"/> <property name="jwtPrefixId" value="TokenId_"/> <property name="jwtAudienceKind" value="RscServers "/> <property name="jwtAudience" value="http://hardis-group.com/apis;http://hardis.fr/apis"/> <property name="jwtLoginModuleName" value="jwtLDAPLoginModule"/> ... <bean>
Nom du claim |
JwtProviderConfig (propriétés) |
iat : issued at exp : expiration time nbf : not before |
La propriété jwtValidityTimeClaim permet de fixer le claim prédéfini à utiliser pour gérer la validité temporelle du jeton. Par défaut : "iat". La propriété jwtTtl (en s ; par défaut : 3600) permet de calculer la valeur des claims exp ou nbf à partir de l'heure courante. Ainsi pour le claim : exp : le jeton expirera à partir de : heure courante + jwtTtl nbf : le jeton deviendra valide à partir de : heure courante + jwtTtl |
iss (issuer) |
La propriété jwtIssuer permet de renseigner l'émetteur du jeton. Par défaut : "jwtProvider/hardis-group.com" |
jti (JWT id) |
Identifiant du jeton. La propriété jwtPrefixId permet de définir un préfixe pour l'identifiant du jeton. L'ID complet est construit en concaténant ce préfixe avec le temps Unix courant. Par défaut : "TokenId_" |
aud (audience) |
La propriété jwtAudienceKind permet de définir le type d'audience à contrôler. Les valeurs possibles sont :
Pour une audience de type 'RscServers', la propriété jwtAudience permet - via des préfixes d'URL - de renseigner les serveurs de ressources destinataires du jeton. |
roles |
La propriété jwtUserRoleClaim permet de définir le nom du claim à utiliser pour stocker les rôles de l'utilisateur authentifié. Par défaut : "roles". |
Pour terminer la création du jeton, celui-ci est signé numériquement à l'aide d'une clé de chiffrement.
Cette même clé est utilisée par le serveur de ressources pour valider la signature du jeton.
Le jeton JWT retourné par le service est représenté sous la forme d'une chaîne constituée de 3 parties : "A.B.C".
Le '.' est le caractère séparant chacune des parties, chaque partie étant encodée en base64.
Exemple de jeton JWT :
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9 .eyJzdWIiOiJTVmlnbmVsbG8iLCJpc3MiOiJhdX
RoLmhhcmRpcy5jb20iLCJpYXQiOjE0NjU1NzI2MTksImF1ZCI6Imh0dHA6Ly9oYXJkaXMtZ3Jvd
XAuY29tIiwianRpIjoiVG9rZW5JZF8xNDY1NTcyNjIxIiwicm9sZXMiOlsidXNlciJdLCJzcGVj
Q2xhaW0xIjoiU2VyZ2UuVmlnbmVsbG9AaGFyZGlzLmZyIiwic3BlY0NsYWltMiI6IlNWaWduZWx
sbyJ9. SDmrfjIsnv04_SqxoQDCsvc5yclPSLF2FXkTmjj6klSCzPOb5ADpKTavFzh902Usf
-
9k0mhbW6zT4NeIQB3cxRKpL0iDT85eJwPucvycMzmQ2Fs4N6yxdJYJl0JQzMKTcnCVzdKGh
-
6V5FP25nfZaFyyMlBGCLj9ynudJSdgIw1MjnpZKEpek6Nk4Fgj0OrO1RIL1ULYVkYtwnFDPZbLL
PqQ7ulTRwLeUEEn5ZaDnfTXp8M0LM22SZOS_VRzH_WgEAnlv_GlaWRXq4ijFTm8TRpNu4cURB0A
dYZuBbTiR_a4K1b5X430WUr0CdfhLiYM
-eY2VsG7Ie0Jis1ZxuT6XA
La première partie (en vert) est l'en-tête du jeton. Il contient les claims prédéfinis typ et alg. Ceux-ci ont respectivement les valeurs 'JWT' et 'HS256' (algorithme de chiffrement).
Ainsi l'en-tête JSON { "typ": "JWT", "alg": "RS256"} encodé en base64 donne la partie A du jeton : eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.
La seconde partie (en bleu) est le corps du jeton. Il contient les claims prédéfinis (sub, iss, iat ou exp ou nbf, jti, aud) et des claims privés additionnels (roles, …).
La troisième et dernière partie (en orange) est la signature numérique du jeton calculée à partir la première et deuxième parties, toutes deux encodées en base64, de l'algorithme et de la clé de chiffrement.
La fonction de la VaToolBx nommée VaToolBxAwsGetJWTClaim permet, dans un programme Visual Adélia Batch (service REST), de récupérer la valeur associée à un nom de claim du jeton JWT utilisé pour authentifier l'utilisateur.