Feature de changement de langue inopérante si l'utilisateur se connecte via notre IDP

Request description

Lorsqu’un utilisateur se connecte via notre IDP (OAUTH2), il ne peut pas changer de langue sans modifier sa langue préférée dans l’annuaire d’entreprise et se reconnecter. Lorsqu’il se connecte directement par le login/mot de passe Simplicité, il peut changer de langue dans sa session courante.

Il semble que le preferredLanguage fourni dans le token de l’utilisateur écrase systématiquement la langue lors du chargement de son Grant alors que cette propriété a été exclue de tous les mappings configurés.

AUTH_PROVIDERS:

[
    { "name": "simplicite", "type": "internal", "visible": true },
    {
        "name": "renault",
        "type": "oauth2",
        "label": "Sign in with renault",
        "sync": true,
        "client_id": "xxxxxxx",
        "client_secret": "xxxxxxx",
        "scopes": "openid arca role-bca-irn68521 role-api-irn66366",
        "jwt_issuer": "https://idp.renault.com/nidp/oauth/nam",
        "authorize_url": "https://idp.renault.com/nidp/oauth/nam/authz",
        "token_url": "https://idp.renault.com/nidp/oauth/nam/token",
        "tokeninfo_url": "https://idp.renault.com/nidp/oauth/nam/tokeninfo",
        "tokeninfo_mappings": {
            "login": "user_id"
        },
        "jwt_claims_mappings": {
            "login": "uid"
        },
        "userinfo_url": "https://idp.renault.com/nidp/oauth/nam/userinfo",
        "userinfo_mappings": {
            "login": "uid",
            "firstname": "firstname",
            "latstname": "lastname",
            "email": "mail",
            "phone": "phone"
        }
    }
]

OAUTH2_TOKENINFO_MAPPINGS renault (pas encore supprimé mais c’est prévu)

{
	"login": "user_id"
}

OAUTH2_USERINFO_MAPPINGS renault (pas encore supprimé mais c’est prévu)

{
	"login": "uid",
	"firstname": "firstname",
	"latstname": "lastname",
	"email": "mail"
}

J’ai testé aussi en définissant USER_SYNC_DEFAULTS avec le même mapping (sans mapper le preferredLanguage comme suggéré dans le post [Azure AD] Forçage de la langue - #5 by Francois) mais ça ne change pas le comportement…

Steps to reproduce

This request concerns an up-to-date Simplicité instance
and those are the steps to reproduce it: (voir description)

Technical information

Instance /health
Status=OK
Version=5.1.35
BuiltOn=2022-03-19 08:31
Git=release/34afbaeefbb5109867b443c5798d486a221a9b74
Simplicité logs
NA (aucune erreur)
Browser logs
NA
Other relevant information

NA

Peux tu m’indiquer un contenu du userinfo ?

En 5.1, coté ident/authent UI (je pense qu’on parle de ça), la langue est recherchée dans ces users info d’abord en tant que l’attribut de mappé sur “lang” (= “locale” par défaut), puis à défaut en tant que “language”.

NB: En 5.2+ c’est pareil mais on regarde aussi, à défaut, les claims to token JWT.

En fct du contenu du userinfo on ne peut donc pas forcément zapper cette reconnaissance de langue.

On pourrait effectivement changer la logique et ne pas tenter de retrouver une valeur quand un attribut est absent du mapping.

PS: dans tes mappings je vois des latstname au lieu de lastname

Token.userInfo={“sub”:“39336333373464312d65333833313164372d38303030303030302d3030303030303030”,“firstname”:“Bruno”,“preferredLanguage”:“fr,en”,“website”:"bruno.montagnac@renault.com",“mail”:"bruno.montagnac@renault.com",“role-bca-irn68521”:[“datamaps_admin”,“ea_admin”,“bca_admin”,“gdpr_admin”],…,“locale”:“fr,en”,“uid”:“a068181”,“userDirectory”:“arca”,“nickname”:“MONTAGNAC Bruno”,“company”:“RENAULT s.a.s.”}

Li’déal serait que lors d’une ouverture de session ce soit la langue préférée qui s’applique mais que ça ne soit pas réappliqué lorsque l’utilisateur change de langue (ou de scope) depuis une session déjà créée…

PS: Merci pour le PS, j’ai corrigé (je n’avais pas relevé la coquille qui a probablement été copié/collée partout)…

Par rapport à ton user info:

  • preferredLanguage n’est pas pris en compte car pas mappé
  • locale est pris en compte car locale est le fallback si le mapping lang n’est pas explicitement défini (NB: les valeurs multiples ne sont pas gérées car ça n’a pas de sens dans Simplicité => seule la 1ère langue trouvée est prise en compte => donc dans l’exemple fr)

A la réflexion, ce qu’on peut proposer au mieux pour ne risquer de régressions par ailleurs c’est un mécanisme de mapping qui permet de dire explicitement de ne pas tenter de mapping implicite en fallback (genre "lang": "ignore"). Dans ce cas la langue du user sera gérée uniquement par les mécanismes internes de Simplicité.

Ok pour le "lang": "ignore" sachant que je peux traiter spécifiquement le cas du report de la langue préférée lors de la création de l’utilisateur. Après ce sera la langue qu’il aura modifié (ou pas) dans Simplicité qui prévaudra. Pour le cas des ouvertures de sessions, je verrai plus tard si ça vaut le coup d’y revenir…

OK on part là dessus. Ce sera dans le périmètre de la 5.1.36 (et des 52.+)

1 Like

Ca a été poussé sur la 5.2 (et rafraichie sur votre SIM), je te laisse upgrader tes instances 5.2 et vérifier que ça correspond à ton besoin.

Si oui c’est aussi dans les tuyaux pour la 5.1.36 qu’on poussera ce WE ou courant semaine prochaine.

A priori sur la 5.2 https://bcsi.renault.simplicite.io ça ne fonctionne pas…

[Platform]
Status=OK
Version=5.2.0-beta
BuiltOn=2022-03-24 13:24
Git=prerelease/5cdcb8fdaad9b4940645171e920f87422447755e

Ou plutôt il faut que je me déconnecte / reconnecte pour que le changement de langue soit effectif.
→ du coup j’ai retesté le cas sur mes instances et c’est bien ce qu’il se passe en 5.1.35 :

  1. je clique sur le bouton changement de langue (dans le menu)
  2. la page refresh sans changer de langue
  3. je me déconnecte (via le menu quitter) / reconnecte
  4. la langue a changé

Voici comme j’ai configuré la chose:

[
    { "name": "simplicite", "type": "internal", "visible": true },
    {
        "name": "renault",
        "type": "oauth2",
        "label": "Sign in with renault",
        "sync": true,
        "client_id": "xxxxxxx",
        "client_secret": "xxxxxxx",
        "scopes": "openid arca role-bca-irn68521",
        "jwt_issuer": "https://idp2.renault.com/nidp/oauth/nam",
        "jwt_claims_mappings": {
            "login": "uid",
            "firstname": "firstname",
            "latstname": "lastname",
            "email": "mail",
            "phone": "phone",
            "lang": "ignore"
        },
        "authorize_url": "https://idp2.renault.com/nidp/oauth/nam/authz",
        "token_url": "https://idp2.renault.com/nidp/oauth/nam/token",
        "userinfo_url": "https://idp2.renault.com/nidp/oauth/nam/userinfo",
        "userinfo_mappings": {
            "login": "uid",
            "firstname": "firstname",
            "latstname": "lastname",
            "email": "mail",
            "phone": "phone",
            "lang": "ignore"
        }
    }
]

OK je vais essayer de tester dans des conditions similaires et je te tiens au courant

Ok merci.
J’ai qd même un doute sur la conf du genre "lang": "ignore"… je suis censé mettre ça où ?

La synchro n’est dispo que sur l’authent UI.
Sur l’authent API le seul mapping actuellement utilisé c’est login

Normalement, tel que c’est fait, en l’état, en 5.2 c’est le ignore des mappings userinfo qui détermine si on synchronise ou pas la langue.

De manière plus générale la logique de la synchro en 5.2+ c’est de d’abord s’appuyer sur le mapping userinfo (en fallbackant sur un nom d’attribut par défaut) puis, à défaut, d’aller chercher dans les claims JWT.

Ok merci j’ai corrrigé ma conf ainsi :

[
    { "name": "simplicite", "type": "internal", "visible": true },
    {
        "name": "renault",
        "type": "oauth2",
        "label": "Sign in with renault",
        "sync": true,
        "client_id": "xxxxxxx",
        "client_secret": "xxxxxxx",
        "scopes": "openid arca role-bca-irn68521",
        "jwt_issuer": "https://idp2.renault.com/nidp/oauth/nam",
        "jwt_claims_mappings": {
            "login": "uid"
        },
        "authorize_url": "https://idp2.renault.com/nidp/oauth/nam/authz",
        "token_url": "https://idp2.renault.com/nidp/oauth/nam/token",
        "userinfo_url": "https://idp2.renault.com/nidp/oauth/nam/userinfo",
        "userinfo_mappings": {
            "login": "uid",
            "firstname": "firstname",
            "latstname": "lastname",
            "email": "mail",
            "phone": "phone",
            "lang": "ignore"
        }
    }
]

Je confirme suite à l’upgrade de cette nuit que pour rendre le changement de langue effectif, il faut se déconnecter/reconnecter (changement de langue dans la session courante KO y compris en essayent de changer de scope) :

  1. je clique sur le bouton changement de langue (dans le menu)
  2. la page refresh sans changer de langue
  3. je me déconnecte (via le menu quitter) / reconnecte
  4. la langue a changé

Ok j’investigue et je te tiens au courant

Bon j’ai un peu revu la logique et désormais en 5.2+ il faut aussi ignorer au niveau des jwt_claims_mappings car ces mappings sont utilisés en fallback des mappings userinfo (en 5.1 ça n’est pas pris en compte coté UI):

...
"userinfo_mappings": { "login": "...", ..., "lang": "ignore" },
...
"jwt_claims_mappings": { "login": "...", "lang": "ignore" },
...

Pour rappel la sync n’est toujours effectuée qu’au niveau UI.

C’est poussé sur votre SIM, je te laisse tester en 5.2 pour voir si ça marche comme tu veux dans ton cas.

Merci beaucoup, ça marche nickel (c’est très attendu par un certain nombre de users Data Privacy qui partagent très souvent leurs écrans en utilisant plusieurs langues). C’est compliqué à backporter en 5.1 ?

OK tant mieux la transposition de tout ça en 5.1 sera poussée avec la 5.1.36 ce WE

1 Like

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