Encodage Token JWT base 64 non valide

Bonjour,

Nous avons récemment migré de version 5.2.34 vers la 5.3.16. Nous rencontrons une erreur dans les Logs simplicité concernant la validité du token pour l’interconnexion des différentes briques de notre application.

Nous utilisons un token simplicité JWT avec la configuration suivante :

USERTOKENS_DURATION : 90d
USERTOKENS_ISSUER : Simplicite
USERTOKENS_MODE : jwt
USERTOKENS_SIGNATURE_SECRET : (renseigné)
USERTOKENS_URL_PARAM :x_simplicite_authorization
USE_USERTOKENS : yes

Le token expire début 2024 donc pas de soucis là dessus.

Nous avons déjà redémarré nos services plusieurs fois, mais le problème est récurrent, dès le démarrage de simplicité.
Nos autres briques de l’application récupèrent correctement le token, donc ce n’est pas une histoire d’endpoint, Avez vous une idée sur le problème ?

Merci

Technical information

Instance /health

[Platform]
Status=OK
Version=5.3.16
BuiltOn=2023-09-29 15:24
Git=5.3/ada6e86492cace177cb57b570853c82fab936aab
Encoding=UTF-8
EndpointIP=169.254.129.5
EndpointURL=http://47081107d0b9:8080
TimeZone=UTC
SystemDate=2023-10-06 10:31:14

[Application]
ApplicationVersion=2.4.102
ContextPath=
ContextURL=https://agent-recette.ladom.fr
ActiveSessions=2
TotalUsers=14
EnabledUsers=10
LastLoginDate=2023-10-06 10:14:57

[Server]
ServerInfo=Apache Tomcat/9.0.80
ServerType=WEB
ServerActiveSessions=2
ServerSessionTimeout=30
CronStarted=true

[OS]
Name=Linux
Architecture=amd64
Version=5.15.116.1-1.cm2
DockerImageName=centos7
SystemEncoding=UTF-8

[JavaVM]
Version=17.0.8.1
Vendor=Eclipse Adoptium
VMName=OpenJDK 64-Bit Server VM
VMVersion=17.0.8.1+1
ScriptEngine=rhino
ScriptEngineVersion=Rhino 1.7.13 2020 09 02
HeapFree=160722
HeapSize=549888
HeapMaxSize=1673216
TotalFreeSize=1284050

[Cache]
ObjectCache=781
ObjectCacheMax=10000
ObjectCacheRatio=7
ProcessCache=781
ProcessCacheMax=10000
ProcessCacheRatio=7
APIGrantCache=1
APIGrantCacheMax=1000
APIGrantRatio=0

[Database]
Vendor=3
ProductName=PostgreSQL
ProductVersion=13.11
DriverName=PostgreSQL JDBC Driver
DriverVersion=42.6.0
DBDate=2023-10-06 10:31:14
DBDateOffset=0
DBPatchLevel=5;P03;eae816e5089006449212ca1f2a1fc9f4
UsingBLOBs=false

[Healthcheck]
Date=2023-10-06 10:31:14
ElapsedTime=35

Simplicité logs
2023-10-06 12:28:26,194|SIMPLICITE|ERROR||http://47081107d0b9:8080||ECORED0001|system|com.simplicite.webapp.tools.ServletTool|validateJWTToken||Error Unable to process JWT token: The input is not a valid base 64 encoded string.
2023-10-06 12:28:17,846|SIMPLICITE|ERROR||http://47081107d0b9:8080||ECORED0001|system|com.simplicite.webapp.tools.ServletTool|validateJWTToken||Error Unable to process JWT token: The input is not a valid base 64 encoded string.
2023-10-06 12:28:17,825|SIMPLICITE|ERROR||http://47081107d0b9:8080||ECORED0001|system|com.simplicite.webapp.tools.ServletTool|validateJWTToken||Error Unable to process JWT token: The input is not a valid base 64 encoded string.
2023-10-06 12:28:06,299|SIMPLICITE|ERROR||http://47081107d0b9:8080||ECORED0001|system|com.simplicite.webapp.tools.ServletTool|validateJWTToken||Error Unable to process JWT token: The input is not a valid base 64 encoded string.

Y-a-t-il des caractères particuliers dans le secret ?

Non, c’est un secret de 10 caractères, composé uniquement de lettres

Dans quel contexte d’usage avez vous ce message ? Connexion à la UI ? Appel d’API ? etc.

S’il s’agit d’ “interconnexion des différentes briques de notre application” j’imagine qu’il doit s’agit d’appels API, si oui il me faudrait plus de détails sur la manière dont sont fait ces appels pour pouvoir investiguer dans des conditions similaires

Nous avons une brique API réalisée avec springboot qui permet de transmettre des appels API de notre interface front ( angular ) vers simplicité.
La communication entre ce micro service et simplicité se fait à l’aide de springboot via de l’api rest.
La récupération du Token simplicité se fait avec cette fonction côté brique API

    public static String getToken() throws LadnextException {
        String token = null;
        try {
            LOGGER.info("Get the Ladnext API token");
            token = ladnextClient.getToken();
            if (token == null || token.trim().isEmpty()) {
                LOGGER.error("Error when getting authentication token, the token is invalid or empty");
                throw new LadnextException(LadnextException.Error.API_INVALID_RESPONSE_AUTH_TOKEN);
            }
        } 
        catch (LadnextException e) {
            LOGGER.error("Error retrieving token from ladnext, API is not accessible");
            throw new LadnextException(LadnextException.Error.API_NOT_AVAILABLE);
        }
        return token;
    }

Notre interface LadnextClient :

@FeignClient(name = "ladnext", url = "${ladom.fodemandeur.ladnext.url}", fallbackFactory = LadnextClientFallbackFactory.class, configuration = LadnextFeignConfiguration.class)
public interface LadnextClient {

        String AUTH_TOKEN = "Authorization";

        /**
         * Feign client for the ladnext api
         */

        @RequestMapping(value = "login", method = RequestMethod.GET, produces = "application/json", consumes = "application/json")
        String getToken() throws LadnextException;

Lorsque nous effectuons un appel API ( n’importe lequel depuis le Front-End ), les logs de ce micro service API remontent une erreur 401 Unauthorized (aucune config n’a été touché avant / après l’installation de la 5.3 :

côté Front-End de l’application, nous rencontrons une erreur 502 à chaque appel.

Je ne peux pas analyser ce que fait votre système appelant.

Pouvez vous me fournir les appels via curl (ou via un outil type Postman) équivalents à ce que fait votre système appelant afin que je puisse voir les appels API exacts que vous effectuez et pouvoir essayer de reproduire votre cas (dans le cas particulier de votre configuration) ?

Nous faisons des appels très basiques :
Dans un premier temps, nous récupérons le token JWT avec notre couple username/MP de notre compte API simplicité en webservice uniquement.


ce qui nous donne le token suivant : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJsYWRvbWFkdmFwaTA4MDciLCJpYXQiOjE2OTY1OTYxNDAsImlzcyI6IlNpbXBsaWNpdGUiLCJleHAiOjE3MDQzNzIxNDB9.edRuqVWmJ6GgC8ALFcQq7v3Xsz3y6j_eHHP3-k4rsNU
Ensuite une fois le token récupéré avec cet appel, nous refaisons un appel vers l’url demandée, en incluant le token. LadDemandeur est un objet métier et LadDemandeurMail est l’attribut recherché.

Et dans ce mode d’appel “bas niveau” via Postman de l’API de recherche vous avez une erreur 401 ?

NB: Je ne reproduis pas le pb décrit sur une 5.3 à jour.

Ma config de test (j’ai mis un secret custom de 10 caractères alphanumériques)

Mon test d’appel à une API REST de recherche:

Alors ce qui m’embête c’est qu’en local je ne reproduit pas mon erreur en passant d’une 5.2.34 à une 5.3.16, l’appel api se déroule bien, c’est sur notre application hébergée sur Azure que nous avons un soucis, je vais refaire une passe sur toutes les variables pour m’assurer que ce n’est pas un problème de conf. Je vous tiens au courant dès lundi de mes avancées sur ce sujet. Je vous remercie

A mon avis c’est quelquechose quelque part entre votre appelant et Simplicité qui altère (sur-encode ? tronque ? …) le token.

Je reviens avec des nouvelles. Nous avons identifié le soucis, il venait effectivement de notre appelant.
Lors de la récupération du token avec un get http://localhost:8080/api/login, nous attendons un Json.
image
Or c’est un text qui est normalement récupéré lors de l’appel.

Maintenant la question c’est pourquoi est ce que notre application fonctionnait correctement depuis maintenant 1an et demi sans avoir rencontré ce genre d’erreur.

Nous avons parcouru la release note de la 5.2 et 5.3, sans noter de changements dur ce token. Vous confirmez que rien n’a changé sur l’appel du login ?

Il n’y a pas de différence de code entre la 5.2 à jour et la 5.3 à jour sur la servlet sur /api/login.

Pour mémoire exemples d’utilisation:

La prise en compte du header Accept: application/json a été backporté de 5.3 en 5.2 (dans le cadre de la révision 5.2.39) il y a plus de 6 mois. Cela n’a affectivement pas été indiqué dans la release note (c’est désormais ajouté) mais les appels à /login n’étaient pas sensés se faire jusque là avec ce header puisque la manière nominale d’obtenir du JSON sur /login était le paramètre d’URL ?format=json.

1 Like

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.