A. Serveur d'authentification et serveur de ressources unifiés
Par défaut, la création/actualisation d'un site depuis les attributs du domaine ou de l'environnement déploie les librairies et déclare les Servlets utiles au bon fonctionnement du service d'authentification (Servlet JWTServlet), afin de l'intégrer au serveur de ressources.
Le descripteur de l'application (web.xml) est automatiquement enrichi pour le besoin avec les informations suivantes :
<servlet> <servlet-name>JWTServlet</servlet-name> <servlet-class>com.hardis.jwtprovider.JwtProvider</servlet-class> </servlet> <servlet> <servlet-name>JEELoginServlet</servlet-name> <servlet-class>com.hardis.security.loginmodules.jee.JEELoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>JWTServlet</servlet-name> <url-pattern>/JWTServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>JEELoginServlet</servlet-name> <url-pattern>/security/JEELoginServlet</url-pattern> </servlet-mapping>
Pour compléter la configuration du service d'authentification, il est nécessaire de :
mettre à jour le fichier /WEB-INF/beans.xml en déclarant les objets JwtProviderConfig et JwtJEELoginModule (ou JwtLDAPLoginModule ou JwtAdeliaLoginModule)
placer un Keystore au format JKS nommé RSJwtSecurity.key contenant les clés de l'algorithme de chiffrement asymétrique RSA256 dans le répertoire /WEB-INF/conf de l'application ou externaliser le Keystore à l'aide d'une ressource jndi de type URL via l'alias url/adelRSJwtSecurity utilisant la fabrique com.hardis.common.jndiURLFactory.
Remarque : un Keystore est fourni par défaut dans le répertoire /WEB-INF/conf.sécuriser la couche transport (HTTPS) pour l'accès à la Servlet d'authentification (JWTServlet).
B. Serveur d'authentification autonome
Le service (ou serveur) d'authentification peut-être déployé de façon autonome.
Pour cela, il faut copier le fichier %adeliws%/javarun/jwtProviderStandAlone/jwtProviderStandAlone.war à l'emplacement ad hoc du serveur d'applications.
La configuration du service se fait via un fichier (jwtProv.properties) externalisé sous la forme d'une ressource jndi de type URL via l'alias url/jwtProv avec une fabrique pointant sur la classe. com.hardis.common.JndiURLPropsFactory.
Exemple :
Déclaration d'une ressource jndi de nom url/jwtProv de type URL utilisant la fabrique com.hardis.common.JndiURLPropsFactory.
L'emplacement du fichier jwtProv.properties contenant les informations de configuration du service est fixé à l'aide de l'URL : file:///d:/extcfg/jwtProv.properties
<Resource auth="Container" factory="com.hardis.common.JndiURLPropsFactory" name="url/jwtProv" type="java.net.URL" url="file:///d:/extcfg/jwtProv.properties"/>
Le fichier jwtProv.properties référencé doit déclarer les valeurs pour les propriétés des objets JwtProviderConfig et JwtJEELoginModule (ou JwtLDAPLoginModule ou JwtAdeliaLoginModule), de la façon suivante :
;jwtProviderConfig jwtProviderConfig.jwtUserRoleClaim=roles jwtProviderConfig.jwtValidityTimeClaim=iat jwtProviderConfig.jwtTtl=3600 jwtProviderConfig.jwtIssuer=jwtIssuer jwtProviderConfig.jwtPrefixId=jwtId_ jwtProviderConfig.jwtAudienceKind=RscServers jwtProviderConfig.jwtAudience=http://srvapis1.com/apis ;http://srvapis2.com/apis jwtProviderConfig.jwtLoginModuleName=jwtLDAPLoginModule ;jwtJEELoginModule jwtJEELoginModule.userParameterName=login jwtJEELoginModule.passwordParameterName=password jwtJEELoginModule.securityRoles=role1,role2,role3 jwtJEELoginModule.securityRequestUrl= ;jwtLDAPLoginModule jwtLDAPLoginModule.userParameterName=login jwtLDAPLoginModule.passwordParameterName=password jwtLDAPLoginModule.ldapParameters=\ [type:Domino]\ [connectionsURL:dominoldap.domain.com:389]\ [connectionName:user]\ [connectionPassword:password]\ [connectionTimeout:5000]\ [connectionPoolSize:10]\ [useSSL:false]\ [userBase:o=domain]\ [userSearch:(&(uid={0})(objectclass=dominoPerson))]\ [userSearchScope:SUB]\ [userName:sn]\ [userAttributes:mail,uid]\ [groupBase:o=domain]\ [groupSearch:(member={0})]\ [groupSubtree:true]\ [groupName:cn]\ [rolesMapping:role1=group1;role2=group2|group3] jwtLDAPLoginModule.jwtExtraClaims=[specClaim1:mail][specClaim2:uid] ;jwtAdeliaLoginModule jwtAdeliaLoginModule.userParameterName=login jwtAdeliaLoginModule.passwordParameterName=password jwtAdeliaLoginModule.adeliaParameters=\ [VAAuthProgram:javaobj.JWAUTH]\ [SSOEnabled:false]\ [Unicode:false]
Le service requiert également un Keystore pour le chiffrement du jeton. Ce Keystore est de facto externalisé sous la forme d'une ressource jndi de type URL utilisant la fabrique com.hardis.common.JndiURLFactory via l'alias url/adelRSJwtSecurity.
Exemple :
Déclaration d'une ressource jndi de nom url/adelRSJwtSecurity de type URL utilisant la fabrique com.hardis.common.JndiURLFactory.
L'emplacement du Keystore est fixé à l'aide de l'URL : file:///d:/extcfg/RSJwtSecurity.key
<Resource auth="Container" factory="com.hardis.common.JndiURLFactory" name="url/adelRSJwtSecurity" type="java.net.URL" url="file:///d:/extcfg/RSJwtSecurity.key "/>
Enfin le service d'authentification autonome requiert par défaut un transport sécurisé (HTTPS). Une configuration doit par conséquent être mise en œuvre au niveau du Container Java EE pour satisfaire ce besoin.
Remarques concernant le module d'authentification AdeliaLoginModule :
Ce module d'authentification s'appuyant sur un programme Adélia, il est nécessaire de compléter l'archive jwtProviderStandAlone.war au préalable en :
- ajoutant les classes issues de la génération (de type Java standard) du programme VA_B dans le répertoire WEB-INF\classes.
- ajoutant la librairie adeljrt-<version>.jar dans le répertoire WEB-INF/lib.
Les caractéristiques du programme VA_B d'authentification sont données dans la section Modules d'authentification.
C. Chiffrement / validation du jeton JWT
Un Keystore (nommé RSJwtSecurity.key), contenant les clés de l'algorithme de chiffrement asymétrique RSA256 et permettant de chiffrer ou de valider un jeton, est livré par défaut dans le répertoire WEB-INF/conf de l'application Web créée par Adélia Studio jouant le rôle de serveur de ressources.
Le même Keystore doit être utilisé par le service d'authentification (chiffrement du jeton) et par le serveur de ressources susmentionné (validation du jeton).
Si le service d'authentification et le serveur de ressources sont hébergés par la même application alors le Keystore peut être laissé dans le répertoire WEB-INF/conf de l'application.
Si le serveur d'authentification et le serveur de ressources sont hébergés par des applications distinctes, alors le Keystore doit être externalisé via la ressource jndi nommée url/adelRSJwtSecurity afin de partager ce même Keystore entre les deux applications.
Le Keystore fourni par défaut peut-être remplacé par un autre Keystore qu'il faut créer à l'aide de la commande suivante :
java -cp jwtProvider-{version}.jar;bcprov-jdk15-1.45.jar com.hardis.jwtprovider.JwtKeyTool -generate pathto\RSJwtSecurity.key