Problème avec la fenêtre de connexion sociale (nouvel utilisateur) lorsque /login est ouvert programmatiquement dans un iframe

Bonjour,

Contexte

J’ai développé une application qui utilise l’API Discourse et SSO comme fournisseur d’identité.
Actuellement, l’application est affichée dans une iframe ; par conséquent, pour que la connexion sociale fonctionne correctement, la page /login doit s’ouvrir en dehors de l’iframe, dans un nouvel onglet du navigateur.
Jusqu’ici, tout va bien.

Problème

Lorsqu’un nouvel utilisateur s’inscrit via un bouton de connexion sociale, il est correctement redirigé vers le site social. Une fois de retour sur Discourse, c’est là que se situe le problème : Discourse affiche la fenêtre de connexion au lieu de celle avec le nom d’utilisateur ou l’adresse e-mail déjà remplis.
Pour voir la fenêtre permettant de finaliser votre inscription, vous devez fermer la fenêtre de connexion, puis cliquer manuellement sur le bouton d’inscription.

Pour les nouveaux utilisateurs uniquement, la connexion fonctionne comme prévu.
Ai-je manqué quelque chose ou y a-t-il un contexte que Discourse ne gère pas correctement ? Techniquement, cela devrait être identique.

Si vous souhaitez voir une démo, n’hésitez pas à me le faire savoir ; je peux vous envoyer une courte vidéo par MP (elle contient des informations privées).

Toute aide est la bienvenue !

Utilisez-vous la dernière version de Discourse ?

Oui. (Désolé pour les textes non anglais, je travaille pour un client utilisant l’hébreu)

Avez-vous des conseils à ce sujet, s’il vous plaît ?

Pour être plus précis, l’application est utilisée dans une extension Chrome. Nous utilisons un iframe car nous n’avons pas le choix pour le moment. Cependant, je ne suis toujours pas certain de la différence entre ouvrir programmatiquement depuis un iframe un nouvel onglet dans le navigateur vers /login ou /signup directement, et ouvrir manuellement un onglet puis cliquer sur le bouton de connexion/inscription.

Est-ce quelque chose qui peut être corrigé dans Discourse ?

Actuellement, nous utilisons Discourse comme fournisseur SSO. Existe-t-il d’autres méthodes ?
Si oui, quelle serait la meilleure façon de procéder pour la connexion/inscription dans ce contexte ?

Comment avez-vous implémenté cela ? Il semble que des cookies ou une session soient perdus quelque part.

En général, nous ne prenons pas en charge l’utilisation de Discourse dans une iframe. Comme vous l’avez constaté, il existe des comportements étranges qui peuvent causer des problèmes.

Je n’intègre pas Discourse dans une iframe. J’utilise l’API pour afficher les messages d’un sujet.

Je ne tente pas de me connecter ou de créer un compte à l’intérieur d’une iframe, car les sites sociaux ne permettent pas d’être affichés dans ce cadre. C’est pourquoi, lorsqu’un utilisateur clique sur un bouton dans l’iframe, cela ouvre un nouvel onglet du navigateur vers la page /login de Discourse.

Techniquement, lorsque l’utilisateur clique sur le bouton de connexion, un nouvel onglet s’ouvre avec /session/sso_provider. return_sso_url contiendra une URL vers le backend pour traiter les données, sauvegarder les informations de session de l’utilisateur, puis répondre avec du HTML pour fermer automatiquement la fenêtre. L’application détectera ensuite que l’opération est terminée et sera rechargée automatiquement afin d’utiliser la session utilisateur sauvegardée.

Même si l’application n’était pas dans une iframe, la même chose se produirait probablement. Puisqu’il s’agit d’une extension de navigateur, vous n’avez pas d’autre choix que d’ouvrir un nouvel onglet de toute façon. Je me demande s’il existe de meilleures façons de se connecter ou de créer un compte dans ce cas.

EDIT : Voici une démo (qui n’était pas destinée au public, mais bon, c’est le moyen le plus rapide de montrer le problème et j’ai l’impression de ne pas m’expliquer suffisamment clairement) :
supprimé, vidéo retirée, personne ne s’en soucie de toute façon
EDIT2 : Cela semble se produire uniquement lors de l’utilisation de l’API /session/sso_provider ; si j’ouvre directement l’URL de Discourse (toujours depuis une iframe), le problème ne semble pas se produire.