Quelqu'un a-t-il de l'expérience dans la création d'un mécanisme d'authentification avec le nouveau routeur en pré4?
Voici quelques-unes de mes réflexions à ce jour:
Je pense que je devrais utiliser une machine d'état Ember pour cela, mais je ne sais pas comment procéder. Quelqu'un a-t-il déjà résolu ce problème?
MISE À JOUR: Comme @DustMason le dit dans sa réponse, consultez le génial embercasts pour les meilleures pratiques d'authentification.
Afin de séparer complètement la vue (application Ember) du serveur (application Rails), je souhaite utiliser l'authentification par jeton. J'utiliserai probablement Devise sur le serveur Rails.
Logique.
J'ai besoin de quelque chose comme un équivalent de before_filter dans l'application Ember où je peux vérifier s'il y a un utilisateur actuel et si cet utilisateur a un jeton d'authentification défini.
Vous pouvez ajouter un hook enter
sur les routes, c'est à peu près équivalent à un before_filter. Mais je ne suis pas sûr que ce soit le meilleur endroit pour vérifier un jeton d'authentification.
Le serveur Rails renverra le jeton d'authentification actuel à chaque appel.
Logique. Nous utilisons l'authentification par cookie et récupérons le profil utilisateur actuel en appelant /api/me
mais l'un ou l'autre devrait fonctionner.
Si elle renvoie un jeton d'authentification nul, l'application Ember devrait détecter cela et passer à l'état non authentifié, en redirigeant vers la vue de connexion.
La chose à propos de cette approche est que (contrairement à Rails), il n'est pas facile de "protéger" l'accès à un certain ember routes. Et peu importe ce qu'un utilisateur peut toujours ouvrir la console JS et entrer dans n'importe quel état, il Donc, au lieu de penser que "l'utilisateur ne peut entrer dans cet état que s'il est authentifié", envisagez "ce qui se passe si un utilisateur non authentifié navigue vers cette route"
Je pense que je devrais utiliser une machine d'état Ember pour cela, mais je ne sais pas comment procéder. Quelqu'un a-t-il déjà résolu ce problème?
Nos besoins d'authentification sont assez simples, nous n'avons donc pas trouvé le besoin d'une machine d'état. Au lieu de cela, nous avons une propriété isAuthenticated
sur ApplicationController. Nous utilisons cette propriété dans application.hbs
pour remplacer la vue principale par un formulaire de connexion lorsqu'un utilisateur n'est pas authentifié.
{{if isAuthenticated}}
{{render "topnav"}}
{{outlet}}
{{else}}
{{render "login"}}
{{/if}}
Depuis ApplicationRoute, nous récupérons le profil utilisateur:
App.ApplicationRoute = Ember.Route.extend({
model: function() {
var profiles;
profiles = App.Profile.find({ alias: 'me' });
profiles.on("didLoad", function() {
return profiles.resolve(profiles.get("firstObject"));
});
return profiles;
}
});
Ensuite, notre ApplicationController calcule qu'il s'agit de la propriété isAuthenticated en fonction du profil renvoyé.
Je suggère d'utiliser ember-auth pour cela. Il implémente toutes les fonctionnalités nécessaires et fonctionne très bien à mon avis.
Il y a aussi un démo et tutoriel avec Devise sur Rails du même auteur).
J'ai également implémenté une application de base Ember basée sur Ember-auth avec authentification par jeton Devise et exemple Oauth pour Google et LinkedIn qui peut être trouvée ici et est en direct ici: https://starter-app.herokuapp.com
Je suis récemment passé d'un système d'authentification sur mesure à l'utilisation de ember-simple-auth et je l'ai trouvé très facile à intégrer à mon application. Il remplit toutes les exigences des PO et intègre également la prise en charge des jetons de rafraîchissement.
Ils ont une API vraiment sympa et un grand nombre d'exemples. Toute personne intéressée par l'authentification basée sur des jetons doit la vérifier.
Le nouveau routeur asynchrone Ember rend la configuration d'un flux d'authentification plus facile à mon avis! Consultez la série en deux parties sur http://www.embercasts.com/ pour un bon exemple
L'exemple d'application de Josep est vraiment sympa. J'ai fait une copie de son dépôt pour montrer comment le faire avec ActiveRecord au lieu de mongoid, et également activer le module confirmable Devise. Vous pouvez le trouver ici . Ce dépôt a été reconstruit à partir de zéro, plutôt que fourchu, car je voulais me forcer à passer par toutes les étapes pour le faire fonctionner. Je mettrai à jour cette réponse si j'ajoute un fork avec les changements nécessaires pour le faire fonctionner.