getTexts() de Simplicite.Ajax en erreur

Request description

Bonjour,
lors de l’appel à la méthode getTexts() de Simplicite.Ajax, j’ai un retour 401Unauthorized dans le navigateur.
Avec comme Root Cause : Missing auth type (e.g. Bearer)

Extrait (simplifié) du code front :
var appSimplicite = new Simplicite.Ajax("", "api", "user" , "password"); appSimplicite.getTexts()

En me basant sur ce post ainsi que la release note pour la 5.3, je pense que c’est lié au fait qu’il y est Basic au lieu de Bearer dans l’appel vers /api.

Quels sont les actions possibles dans mon scope pour corriger ce comportement ?

Technical information

Instance /health
[Platform]
Status=OK
Version=5.3.38
BuiltOn=2024-05-17 09:22
Git=5.3/cd9b92ec3c680f920be9b3109e12d35b9486fe29
Encoding=UTF-8
EndpointIP=21.0.9.2
EndpointURL=http://ef62d2e0a1a5:8080
TimeZone=Europe/Paris
SystemDate=2024-05-23 18:35:03

[Application]
ApplicationVersion=1.0.0
ContextPath=
ContextURL=https://bca.dok-dev.intra.renault.fr
ActiveSessions=1
TotalUsers=10023
EnabledUsers=1899
LastLoginDate=2024-05-23 18:25:07

[Server]
ServerInfo=Apache Tomcat/9.0.89
ServerType=WEB
ServerActiveSessions=1
ServerSessionTimeout=30
CronStarted=true

[OS]
Name=Linux
Architecture=amd64
Version=4.18.0-513.24.1.el8_9.x86_64
DockerImageName=centos7
SystemEncoding=UTF-8

[JavaVM]
Version=17.0.11
Vendor=Eclipse Adoptium
VMName=OpenJDK 64-Bit Server VM
VMVersion=17.0.11+9
ScriptEngine=rhino
ScriptEngineVersion=Rhino 1.7.13 2020 09 02
HeapFree=1045914
HeapSize=1806376
HeapMaxSize=3040896
TotalFreeSize=2280434

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

[Database]
Vendor=2
VendorName=mysql
ProductName=MySQL
ProductVersion=5.6.39-log
DriverName=MySQL Connector/J
DriverVersion=mysql-connector-j-8.4.0 (Revision: 1c3f5c149e0bfe31c7fbeb24e2d260cd890972c4)
DBDate=2024-05-23 18:35:03
DBDateOffset=0
DBPatchLevel=5;P03;29131276dea85455af3d320043396699;38
UsingBLOBs=true

[Healthcheck]
Date=2024-05-23 18:35:03
ElapsedTime=14
Simplicité logs
2024-05-23 17:37:38,763|SIMPLICITE|ERROR||http://ef62d2e0a1a5:8080||ERROR|system|com.simplicite.webapp.servlets.api.JSONServlet|service||Event: Authentication error: Missing auth type (e.g. Bearer)
Browser logs
/api/json/app?action=texts&_ajaxkey=xxxxxxxxxx&_tabid=xxxxx 401 (Unauthorized)
_call	@	ajax-bundle.js?_=5.3.38:119
call	@	ajax-bundle.js?_=5.3.38:204
getTexts	@	ajax-bundle.js?_=5.3.38:207

J’ai besoin de mieux comprendre le contexte de votre demande.

S’agit il d’un appel au sein de la UI ou depuis un frontend externe ?

Si vous êtes au sein de la UI ça n’a pas de sens de passer un user/password au Simplicite.Ajax() car vous êtes déjà authentifiés. Ca n’a pas de sens non plus d’utiliser le endpoint API puisque vous êtes mécaniquement sur le endpoint UI

Bref, dans ce contexte, la bonne syntaxe est donc du type:

const app = $ui.getAjax();
app.(...)

C’est un front externe.

Ce frontend est il servi par Simplicité ?

Je pose la question pour comprendre pourquoi votre attribut URL est vide dans votre instanciation…

PS: utiliser la lib interne Ajax de la UI est un pattern historique à considérer désormais comme deprecated. Pour implementer des frontends externes il est recommandé d’utiliser la lib cliente JS dédiée disponible ici: simplicite - npm. Celle-ci est plus simple et plus moderne et est conçue pour être utilisée au sein des frameworks JS du marché type Vue.js/React/Angular/… Si besoin il y a de boilerplates sur notre GitHub, dites moi quelle technos vous utilisez je vous indiquerai l’exemple approprié.

PS: Ce qui manque dans votre code c’est l’appel à login, car sinon la session n’est pas initialisée et vos appels finissent forcément en 401

ex: (très simplifié)

const app = new Simplicite.Ajax('https://(...)', 'api', '(...)', '(...)');
app.login(() => app.getTexts(texts => console.log(texts)));

ATTENTION il faut écrire votre code de manière à ne faire qu’un unique appel initial à login, il ne faut bien entendu pas le faire à chaque appel. Idem pour l’instaciation du Simplicite.Ajax il faut que votre code n’en instancie qu’un seul globalement

En effet, c’est un frontend servi par Simplicité.
Concernant l’appel à login, c’est lié aussi la 5.3 ? En 5.2, ce même code fonctionnait.

Jusqu’en 5.1 il était encore possible d’appeler les services avec une ident/authent Basic auth (= sans devoir appeler login qui est l’appel qui permet de récupérer le token utilisé en Bearer par la suite) mais c’était deprecated depuis la 4.0 et donc fortement découragé.

Cette possibilité à été définitivement supprimée dans le cadre de la 5.2 (cf. la release note compatbreakingchanges-apicredentials)

PS: une des raisons du changement est de simplifier les appels publics (=eviter de devoir utiliser un pseudo-user technique), si votre frontend est accessible publiquement et servi sur la même URL que Simplicité, il serait plus pertinent d’utiliser le endpoint UI public (plutôt que API) qui ne nécessite pas l’utilisation d’ident/authent.

Dans l’exemple indiqué ci-dessus ça donnerait:

const app = new Simplicite.Ajax('', 'uipublic');
app.getTexts(texts => console.log(texts));

Il faut alors juste habiliter le user public à ce qui est appelé publiquement, en pratique ça consite à ajouter des droits au groupe PUBLIC ou des groupes dedroits dans le profil du groupe PUBLIC

Ok, compris. Il faut que je fasse un travail d’investigation sur les raisons de ne pas avoir utilisé cette configuration.

Merci pour les infos et précisions.

NB: Si vous optez pour l’approche publique assurez vous bien que le user public a le pooling d’objets activé (surcharge user du param système USE_WEBSERVICES_OBJECTPOOL à yes):

Idem si vous restez dans une approche avec un pseudo-user technique unique d’ailleurs.

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