En fait, tant que le joueur ne fait pas d'action "à sauver" (en gros, que du GET, pas de POST), je ne fais rien. C'est un visiteur tout ce qu'il y a de plus classique, sans même une session PHP puisque je m'en tape de le pister (et que je n'ai pas envie d'avoir 5 millions de sessions ouvertes pour chaque bot qui se ballade).
A partir du moment où le joueur fait un POST, s'il n'a pas de session, alors je lui réponds une page d'inscription / connexion, et je relance ensuite la requête. Dans la pratique:
- Le visiteur est sur une page (la création de vaisseaux par exemple), récupérée en GET donc sans session ni rien
- Il fait son vaisseau, c'est du full-client là, c'est juste de l'interface et de l'UX donc pas de soucis
- Il clic sur "save", un JS prend la main sur la soumission de formulaire et l'envoie en AJAX, sans session
- Le serveur n'a pas de session pour cette requête, il répond donc une exception type "NotLoggedInException", c'est à dire un HTTP 401 + JSON {"exception":"NotLoggedInException"} (un truc du genre, c'est déjà en place ça d'ailleurs) + header "X-Location: page-de-connexion-inscription" (X-Location car si j'utilise Location, le JS va directement la suivre, ce qui me pose soucis: y'a pas de "NoFollow" dans les options AJAX)
- le JS récupère la réponse, voyant qu'il s'agit d'une 401 (et voyant éventuellement le contenu de la réponse), il va chercher la page de connexion (X-Location), soit pour la mettre dans une pop-in (iframe), soit il ouvre direct une popup avec cette page, je ne sais pas trop (j'opte plutôt pour l'iframe jusqu'ici)
- Le joueur entre ses identifiants pour se connecter ou s'inscrire (dans l'iframe ou la popup) et soumet le formulaire
- Le JS AJAX de l'iframe s'enclenche, requête le serveur, le serveur l'inscrit (classique), le JS récupère la réponse, et émet un event
- Le JS AJAX de la page de départ récupère cet event, et renvoie la même requête qu'au tout début
- Le joueur ayant été connecté/inscrit entre temps, la session PHP existe, le serveur reconnait le joueur, et le plan de vaisseau est sauvegardé
Il n'y a donc pas de "jeu" complet sans être loggé, mais on peut commencer son action de jeu sans être loggé (et on doit alors l'être pour la sauver). Cela permettra aux joueurs de voir comment jouer sans être préalablement inscrit, et d'être poussés à s'inscrire pour ne pas perdre le plan qu'ils viennent de concevoir.
PS: si t'empêche les cookies, l'inscription se fera, l'event se triggé, mais l'AJAX de la page de départ ré-échouera après l'inscription car le cookie de session n'aura pas été sauvé (charge à toi de ne pas refuser tous les cookies). Si le JS n'est pas actif sur le client (déjà, niveau UX et interface il va en chier), là, y'aura rien qui se passera... Le serveur lui répondra la page X-Location (avec donc une page HTML classique disant "va voir là"), mais le plan de vaisseau sera perdu puisqu'il n'y aura pas de JS pour relancer la requête. Je peux toujours rajouter un "<noscript>" au template HTML pour ces cas là.
A partir du moment où le joueur fait un POST, s'il n'a pas de session, alors je lui réponds une page d'inscription / connexion, et je relance ensuite la requête. Dans la pratique:
- Le visiteur est sur une page (la création de vaisseaux par exemple), récupérée en GET donc sans session ni rien
- Il fait son vaisseau, c'est du full-client là, c'est juste de l'interface et de l'UX donc pas de soucis
- Il clic sur "save", un JS prend la main sur la soumission de formulaire et l'envoie en AJAX, sans session
- Le serveur n'a pas de session pour cette requête, il répond donc une exception type "NotLoggedInException", c'est à dire un HTTP 401 + JSON {"exception":"NotLoggedInException"} (un truc du genre, c'est déjà en place ça d'ailleurs) + header "X-Location: page-de-connexion-inscription" (X-Location car si j'utilise Location, le JS va directement la suivre, ce qui me pose soucis: y'a pas de "NoFollow" dans les options AJAX)
- le JS récupère la réponse, voyant qu'il s'agit d'une 401 (et voyant éventuellement le contenu de la réponse), il va chercher la page de connexion (X-Location), soit pour la mettre dans une pop-in (iframe), soit il ouvre direct une popup avec cette page, je ne sais pas trop (j'opte plutôt pour l'iframe jusqu'ici)
- Le joueur entre ses identifiants pour se connecter ou s'inscrire (dans l'iframe ou la popup) et soumet le formulaire
- Le JS AJAX de l'iframe s'enclenche, requête le serveur, le serveur l'inscrit (classique), le JS récupère la réponse, et émet un event
- Le JS AJAX de la page de départ récupère cet event, et renvoie la même requête qu'au tout début
- Le joueur ayant été connecté/inscrit entre temps, la session PHP existe, le serveur reconnait le joueur, et le plan de vaisseau est sauvegardé
Il n'y a donc pas de "jeu" complet sans être loggé, mais on peut commencer son action de jeu sans être loggé (et on doit alors l'être pour la sauver). Cela permettra aux joueurs de voir comment jouer sans être préalablement inscrit, et d'être poussés à s'inscrire pour ne pas perdre le plan qu'ils viennent de concevoir.
PS: si t'empêche les cookies, l'inscription se fera, l'event se triggé, mais l'AJAX de la page de départ ré-échouera après l'inscription car le cookie de session n'aura pas été sauvé (charge à toi de ne pas refuser tous les cookies). Si le JS n'est pas actif sur le client (déjà, niveau UX et interface il va en chier), là, y'aura rien qui se passera... Le serveur lui répondra la page X-Location (avec donc une page HTML classique disant "va voir là"), mais le plan de vaisseau sera perdu puisqu'il n'y aura pas de JS pour relancer la requête. Je peux toujours rajouter un "<noscript>" au template HTML pour ces cas là.