web-dev-qa-db-fra.com

Jeton Joomla avec demande ajax

J'ai construit un module qui demande des données au serveur via une requête ajax. Il inclut le jeton Joomla pour valider la session.

Une chose étrange se produit - lorsque j'ouvre Chrome et charge la page, le module est rempli correctement et le jeton de formulaire est validé.

J'ouvre ensuite Firefox pour tester, et la validation du jeton échoue, mais le même jeton est utilisé.

J'avais supposé que les différents navigateurs ouvriraient une nouvelle session dans Joomla et recevraient donc un nouveau jeton.

Pourquoi le même jeton est-il émis dans deux sessions de navigateur différentes?

AJOUTER PLUS D'INFO:

Le contrôleur vérifie le jeton comme suit:

JSession::checkToken('get') or die( 'Invalid Token');

La vue effectue la demande ajax en utilisant le jeton en tant que variable URL:

index.php?option=com_mycomponent&format=raw&task=ajax.myTask&50e6a74276c578d2ebfc40fd526a193f=1

Le jeton est généré à l'aide d'un appel ajax à une autre fonction qui génère le jeton à l'aide de:

echo JFactory::getSession()->getFormToken();

Ce n'est pas génial, mais c'est le seul moyen que j'ai trouvé d'essayer de contourner le cache de Joomla: il a tendance à mettre en cache les jetons générés dans les vues lorsque vous avez besoin de les incorporer dans des requêtes ajax. Nous les demandons donc à un autre service.

5
user101289

Tout d'abord, cela semble très étrange.

Lors de l'ouverture de la page dans deux navigateurs, Joomla devrait générer deux identifiants de session différents (vérifiez les cookies générés par Joomla, ils devraient être différents!). Ceci est dû à l'agent utilisateur.

Une fois que le jeton est généré, il est fondamentalement enregistré dans la session et la prochaine fois que vous appelez getFormToken () sur l'objet Session, vous récupérez le même objet. Cela indique en quelque sorte que Joomla utilise la même session!? Mais plus tard, ne parvient pas à valider le même jeton?

Vous pouvez essayer getFormToken (true) pour forcer la génération d'un nouveau jeton, uniquement à des fins de test.

Avec la quantité de détails techniques que vous avez partagés, ce sont les meilleures idées auxquelles je puisse penser.

Pensez à tester votre module à partir d'une autre machine, essayez les modes de navigation privée sur votre navigateur ou partagez un exemple sur github.

J'espère que cela t'aides.

1
Valentin Despa