Robert-2 / Robert2

Application web de gestion de parc de matériel destiné à la location ou au prêt
https://robertmanager.org
Other
42 stars 14 forks source link

Jeton d'authentification expiré : Téléchargement des images #387

Closed LaplancheMaxime closed 7 months ago

LaplancheMaxime commented 1 year ago

Messieurs,

Je me permet de refaire un ticket concernant mon ticket #383 Le souci n'est pas résolu avec la version 20.X

Actuellement pour récupérer l'image d'un matériel, je passe par l'url publique, avec le jeton d'identification de la session. Cependant, lors que le jeton a expiré, j'ai comme retour la page de connexion.

Est-il possible d'avoir un endpoint sur le contrôleur pour récupérer la photo ? Je pense qu'il faut "juste" ajouter la route api/materials/:id/picture, vers getPicture du controller ?

En vous remerciant par avance Bon courage

polosson commented 1 year ago

Bonjour @LaplancheMaxime !

Je pense avoir mieux compris votre besoin ici : vous voulez avoir accès publiquement aux photos du matériel, c'est bien ça ?

En fait, le logiciel ne permet pas de faire cela, car selon nous les photos font partie des données du matériel au même titre que toutes ces autres informations, et sont donc accessible uniquement quand l'utilisateur est connecté.

On pourrait éventuellement envisager d'ajouter un paramètre global pour activer la visibilité "publique" des images liées au matériel, mais ce n'est pas un cas d'usage très courant... Quel est votre besoin exactement ? Pourquoi vouloir afficher ces photos de publiquement ? Je vous demande ça juste pour bien comprendre le besoin et voir si il n'y a pas une meilleure façon de faire.

En attendant, une solution temporaire serait de paramétrer votre instance avec une valeur très élevée pour la clé sessionExpireHours (voir sur le wiki). Ainsi, votre token expirera moins souvent (mais il expirera quand même un jour)...

Une autre solution en attendant (pas du tout perenne, voir même très sale) serait d'ajouter tous les URLs de vos photo matériel dans la constante PUBLIC_ROUTES de la classe Robert2\API\Config\Acl... Comme ceci :

public const PUBLIC_ROUTES = [
    '/materials/12/picture',
    '/materials/32/picture',
    '/materials/35/picture',
    '/materials/41/picture',
    // ... etc.
];

Ou bien d'adapter la méthode match() de la classe Robert2\API\Http\Request pour qu'elle accepte un placeholder d'identifiant dans le matching de l'URL... Mais attention, toucher à cette méthode peut avoir un impact sérieux sur la sécurité !

LaplancheMaxime commented 1 year ago

Bonjour @polosson, Désolé pour ma réponse tardive.

Nous utilisons Robert dans son utilisation prévue. Cependant, nous avons un front qui nous permet à nos clients de faire des demandes de location/devis directement depuis celui-ci. Nous mettons également à disposition une liste des matériels disponibles.

Nous utilisons donc l'API de Robert pour les actions suivantes

Nous l'utilisons également pour synchroniser les bénéficiaires de robert vers des tiers facturables dans notre ERP. Pour réaliser l'ensemble des actions, nous utilisons un utilisateur "API". Nous l'authentifions via le endpoint POST - /session

Le contexte est-il plus précis ?

Le problème, c'est lorsque nous tentons de récupérer les photos mais que le jeton est expiré, nous obtenons un retour en HTML, en HTTP 200. (La page de login en l’occurrence) Nous utilisons donc le endpoint/materials/12/picture comme prévu. Est-il possible de passer cet endpoint dans la route api/. Exemple :

Nous pourrions ainsi profiter du même comportement que tous les autres endpoints ? (404, 404, 200, etc...)

polosson commented 7 months ago

Hello @LaplancheMaxime,

Ceci va être corrigé dans la prochaine version (0.24) : les URL des photos de matériel vont devenir "publiques". Il faudra utiliser l'URL /static/materials/[id]/picture à la place de materials/[id]/picture.

Cette nouvelle route étant publique, vous n'aurez donc plus besoin d'authentification JWT préalable pour récupérer les photos du matériel.

Je ferme ce ticket vu que ce sera très bientôt corrigé :slightly_smiling_face: