Permalink et customAuth, la suite

Request description

Bonjour,

Je reviens sur ce ticket dont j’essaie sans succès d’implémenter la solution.

Mon souci initial est que le permalink se perd après le passage dans customAuth.

Avec customAuth

Sans customAuth

La solution proposée consiste à ajouter le permalink aux attributs de session, mais je ne sais pas laquelle ? Vous est-il possible de m’éclairer sur où récupérer la variable session dont il est question ci-dessous ?

session.setAttribute(Globals.SESSION_PERMALINK, permalink);

Merci d’avance pour votre aide,
Emmanuelle

[Platform]
Status=OK
Version=6.2.21
BuiltOn=2026-01-15 22:16

Est-ce que le pb se produit sur une 6.2 à jour (6.2.24, sachant qu’une 6.2.25 étant aussi releasée aujourd’hui) ?

Ou d’ailleurs plutôt sur une 6.3 à jour car la 6.2 vis ses tout derniers jours (fin de maintenance LTS dans 10 jours)

Oui pour 6.2, nous n’avons pas ce paramétrage sur nos projets 6.3

[Platform]
Status=OK
Version=6.2.25
BuiltOn=2026-04-03 10:11

OK on regardera ça mais dans le cadre de la 6.3+ car on ne backportera plus rien (hors correctifs de sécurité critiques) sur la 6.2 d’ici sa fin de maintenance

Bonjour David,

Je me permets de relancer ce sujet car nous sommes désormais passés en version 6.3.7.

Avez-vous pu regarder s’il existe une solution native ou un “workaround” spécifique en 6.3 pour que ce paramètre survive au flux OAuth2 ?

Merci d’avance pour votre aide !

Abed

Bonjour

Désolé cette demande est restée en stand by chez nous…

Si on parle d’une ident/authent “OAuth2” qu’est ce qui justifie de passer par un hook customAuth ?

Bonjour David,

Notre souci n’a pas de lien avec OIDC, il s’agit bien de perte de permalink en passant par customAuth.

Merci d’avance pour ton aide
Emmanuelle

J’ai testé avec un deep link de liste (<base URL>?l=DemoSupplier) et de formulaire (<base URL>?f=DemoSupplier%3B2) et un permalink (<base URL>/ui/l/suppliers-bim) et je ne vois pas de pb avec ce customAuth minimal:

package com.simplicite.commons.Application;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PlatformHooks extends com.simplicite.util.engine.PlatformHooksInterface {
    @Override
    public String customAuth(HttpServletRequest request, HttpServletResponse response) throws Exception {
        return "designer";
    }
}

Je pense donc que votre customAuth fait des choses plus subtiles qui font perdre les liens profonds.

Ou alors peut être simplement que les permalinks sont vides pour les records que vous testez (ceux-ci se calculent au save du record). Faites une vérification en base du contenu de la colonne row_permalink de la table de votre objet car c’est sur cette base que le permalink est généré/recherché (et transformé en deep link)

@Francois,il manque peut être une action “Recalculer tous les permalinks” car ça peut être pénible de devoir forcer un save sur tous les records (NB: ça peut se faire en update en masse) pour remplir la colonne row_permalink

Merci de ta réponse, je suis en train de retester pour te donner plus d’élements.
En revanche je n’ai pas row_permalink mais obj_permalink, c’est de cela qu’on parle ?
Je suis aussi intéressée par plus d’infos sur

c’est sur cette base que le permalink est généré/recherché (et transformé en deep link)

pour améliorer mon analyse.

Merci à toi !

Voici ce qu’il se passe chez nous quand je saisis le permalink suivi du provider custom :

Ici je n’ai plus le permalink (mais il est encore dans la session)

com.simplicite.commons.RCIB.PlatformHooks|customAuth||Event: customAuth: SESSION_PERMALINK = /form-api-7-test-efe-?_provider=custom:standard_external_auth

Le customAuth (qui a l’air compliqué mais retourne bien API_LOGIN comme nous le souhaitons)

@Override
    public String customAuth(HttpServletRequest request, HttpServletResponse response) throws Exception {
        AppLog.info("customAuth: Method = " + request.getMethod(), Grant.getSystemAdmin());
        AppLog.info("customAuth: URL = " + request.getRequestURL().toString(), Grant.getSystemAdmin());
        AppLog.info("customAuth: QueryString = " + request.getQueryString(), Grant.getSystemAdmin());
		AppLog.info("customAuth: SESSION_PERMALINK = " + request.getSession().getAttribute(Globals.SESSION_PERMALINK), Grant.getSystemAdmin());
        
        JSONObject provider = AuthTool.getAuthProvider(request);
        if (provider != null && STANDARD_AUTH.equals(provider.getString("name"))) {
            String qryString = request.getQueryString();
            String referer = request.getHeader("referer");
            
            if ((qryString != null && (qryString.contains(API_FORM_PERMA_OBJ) || qryString.contains(API_FORM_OBJ) || qryString.contains(API_FORM_CHOICE_OBJ))) 
                || (referer != null && (referer.contains(API_FORM_PERMA_OBJ) || referer.contains(API_FORM_OBJ) || referer.contains(API_FORM_CHOICE_OBJ)))) {
                return API_LOGIN;
            }
            return DEFAULT_LOGIN;
        }
        return super.customAuth(request, response);
    }

Ensuite j’arrive sur la page d’accueil (mais j’ai encore le permalink en referer)

Quand un objet a un permalink configuré la valeur se stocke dans la table de l’objet dans la colonne row_permalink:

C’est cette valeur qui est recherchée pour déterminer le row ID et donc le deeplink correspondant au permallink

Normalement il n’y a rien à faire pour que le permalink (ou le deeplink) soit géré via la valeur en session.

Mais j’avoue ne pas bien comprendre la logique de votre customAuth, n’êtes vous pas en train de “réinventer” l’ident/authent du endpoint API ?

D’accord je pensais qu’il s’agissait d’une colonne dans la table m_object.
J’ai vérifié et on a bien cette colonne dans la table de notre objet métier, renseignée correctement.

Et concernant l’idée derrière le customAuth, il s’agit de connecter avec un User par défaut les personnes qui reviennent en erreur de la connexion OKTA :
OKTA error → customError → customAuth → user par défaut

Peux tu mettre cette ligne en commentaires pour vérifier que le pb ne vient pas du getSession()?

C’est fait, cela ne change rien j’arrive sur la page d’accueil.

OK tant pis.

Peux tu tester que tu as le bon comportement avec le customAuth basique que j’ai utilisé dans mes tests = return "designer"; (ATTENTION de bien retourner designer pour pouvoir conserver l’accès designer).

C’est juste pour vérifier qu’il n’y a pas une subtilité dans votre cas ailleurs que dans la logique de votre customAuth.

Avec ce code j’arrive bien sur le formulaire et le permalink semble être traduit en deeplink.
Est-ce que je dois ajouter des droits à mon user ?

Je n’ai pas compris ce que tu veux dire…

S’il y a un permalink sur le record; le “Copy link” copie le permalink dans le clipboard, sinon ça copie le deeplink

Et, pour info, quand on utilise un permalink, techniquement (et de manière transparente pour l’utilisateur) il est converti en deeplink.

Ma question c’est juste de savoir si, avec un customAuth basique (= return "designer";), les permalinks et les deelinks fonctionnent (lors de mes tests c’est bien le cas).

L’objectif c’est de savoir si le pb est dans ce que fait votre customAuth particulier ou si c’est un pb plus général.

Justement, j’ai testé ton code et le permalink est bien converti.

[EDIT] J’ai aussi remplacé “designer” par notre API_USER et cela fonctionne. Il doit y avoir un souci avec le “if”, je vais essayer de cibler

Alors, avec ceci, j’arrive bien sur mon formulaire

    @Override
    public String customAuth(HttpServletRequest request, HttpServletResponse response) throws Exception {
        return API_LOGIN;
    }

et en ajoutant ces deux lignes, j’arrive sur la page d’accueil

    @Override
    public String customAuth(HttpServletRequest request, HttpServletResponse response) throws Exception {

	String qryString = request.getQueryString();
            String referer = request.getHeader("referer");

        return API_LOGIN;

J’ai ajouté les 2 lignes en question à mon test et ça fonctionne toujours (je ne vois pas en quoi ces 2 lignes pourraient changer la logique):

    @Override
    public String customAuth(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String qryString = request.getQueryString();
        String referer = request.getHeader("referer");
        return "designer";
    }

Je pense donc que c’est plutôt la manière dont c’est appelé en erreur depuis votre IdP qui pose pb chez vous.

Fondamentalement est-ce que votre besoin c’est bien de router sur un user générique si le user n’est pas identifié/authentifié par l’IdP ?