USINE: obtenir de l'utilisateur actuel.id pour Firebase Simple Login (Email / Mot de passe)
Je suis à la recherche d'un moyen concret d'avoir la "id de l'utilisateur courant" dans tous mes contrôleurs disponibles.
Aide: Firebase Simple Pour Se Connecter : E-Mail /Mot De Passe D'Authentification
Mon ida: j'ai besoin d'une 'Usine' qui je peux injecter dans mes contrôleurs,
pour avoir le 'id de l'utilisateur courant" toujours disponible.
Je suis venu avec ce code:
app.factory('User', ['angularFire',
//Get Current UserID
function(angularFire){
console.log ('FACTORY: User');
var currentUser = {};
var ReturnStr = '';
var ref = new Firebase("https://myFIREBASE.firebaseio.com/");
var authClient = new FirebaseAuthClient(ref, function (err, user) {
if (err) {
ReturnStr = 'FACTORY: User Error: ' + err;
console.log (ReturnStr);
//var User = ReturnStr;
} else if (user) {
console.log ('FACTORY: User: Login successfully:');
console.log (user);
currentUser = user;
} else {
//console.log ('-----------User: Logged Out ---------------');
ReturnStr = 'FACTORY: Logged out: Redirect to Login';
console.log (ReturnStr);
window.location.href = "/login.php";
}
});
return currentUser;
}
]);
Mon plus simple Contrôleur ressemble:
function ToDoCtrl($scope, User) {
$scope.MyUser = User;
$scope.MyUser.test = 'Test';
}
En HTML (angulaire partiels) j'ai:
<h2>{{MyUser.id}}</h2>
<h2>{{MyUser.email}}</h2>
<h2>{{MyUser.provider}}</h2>
<h2>{{MyUser.test}}</h2>
=> id, e-mail, le fournisseur de services 'undefined'. Dans la console, je vois l'USINE: Utilisateur: Login avec succès:' avec le bon utilisateur de l'Objet.
=> chargement Asynchrone des données du problème?
J'ai également expérimenté (sans succès):
$timeout(function () {
currentUser = user;
}
Une telle USINE serait très utile!
Merci pour de me pointer dans la bonne direction!
Edition 1.1: Maintenant, avec $rootscope hack
=> Même effet - mycontroller est trop rapide - usine à ralentir.
app.factory('User', ['$rootScope', '$timeout', 'angularFire',
//Aktueller Benutzer auslesen
function($rootScope, $timeout, angularFire){
console.log ('FACTORY: User');
var currentUser = {};
var ReturnStr = '';
var ref = new Firebase("https://openpsychotherapy.firebaseio.com/");
var authClient = new FirebaseAuthClient(ref, function (err, user) {
if (err) {
ReturnStr = 'FACTORY: User Error: ' + err;
console.log (ReturnStr);
//var User = ReturnStr;
} else if (user) {
console.log ('FACTORY: User: Login successfully:');
//currentUser = user;
$timeout(function () {
ReturnStr = 'FACTORY: Inside timout';
console.log (ReturnStr);
currentUser = user;
console.log (currentUser);
$rootScope.myUser = user;
$rootScope.myUserID = user.id;
$rootScope.loggedIn = true;
$rootScope.$apply();
return currentUser;
});
} else {
//console.log ('-----------User: Logged Out ---------------');
ReturnStr = 'FACTORY: Logged out: Redirect to Login';
console.log (ReturnStr);
//var User = ReturnStr;
window.location.href = "/login.php";
}
});
return currentUser;
}
]);
TAHNKS pour toutes suggestions utiles! Wonderin comment les autres à résoudre ce!
- J'ai fait un solide système de connexion avec ces incendies choses que je vais poster quand je rentre à la maison un peu. Il pourrait être parfait pour ce que vous essayez de faire ici.
Vous devez vous connecter pour publier un commentaire.
Voici donc ma solution à ce problème exact. Je suis à l'aide de Firebase, FirebaseAuthClient, et angularFire pour mon Angulaire de l'app. J'ai couru dans la même situation pour mon système de connexion où vous ne pouvez pas injecter de l' $champ d'application dans l'usine et donc je suis venu avec un contrôleur utilisé une usine pour les méthodes de rechercher, ajouter, mettre à jour et supprimer des choses. Et dans le contrôleur, j'ai mon firebaseAuth trucs en cours, le réglage des valeurs de l'Utilisateur, et les références auquel j'attribue à la portée de qui. Une fois que l'utilisateur est connecté, ils sont redirigés vers un autre emplacement, à quel point le app.js fichier prend le dessus avec un contrôleur enfant quand à l'emplacement de l'adresse.
Mon login utilise également localStorage, de sorte que les connexions persiste, vous pouvez l'actualiser et de ne pas avoir à vous connecter, et vous pouvez le modifier pour être les témoins ou sessionStorage assez facile.
Cela va devoir être adapté à vos besoins, en particulier si vous choisissez d'utiliser cette méthode, il est assez complexe de n'importe quoi, mais c'est très solide pour moi et je n'ai plus besoin de s'en soucier firebaseAuth ou angularFire genre de choses maintenant que mon usines sont maintenant en place pour le passage des données d'avant en arrière. Je fais juste angularJS choses surtout avec les directives. Voici donc mon code.
REMARQUE: Cela nécessitera de modifier, et certaines choses seront pseudo ou ouverte pour vous de comprendre vos besoins.
AuthCtrl.js
]);
Et maintenant, pour la simple et sympathique encore tout à fait réutilisable à l'usine. Vous aurez besoin de mettre votre Firebase chemin d'accès de votre application pour la baseUrl variable pour que cela fonctionne.
fireFactory.js
]);
Info
Vous donner l'usine seulement un morceau de la trajectoire de référence tels que les "utilisateurs" qui sera utilisé comme partie du chemin d'accès complet ref à l'endroit où vous souhaitez stocker vos données utilisateur.
Une fois que vous avez un ensemble de référence pour l'utilisateur, ils n'auront pas besoin d'être défini encore, il suffit d'utiliser les données existantes et de .auth() pour cela. De plus, si il y a un existant 'token' dans localStorage il va l'utiliser pour auth() l'utilisateur aussi.
Autrement, il va se connecter() de l'utilisateur et de la pop ouvrir le Oauth windows pour eux de le faire à l'aide quelle que soit l'option que vous leur offrez.
J'ai passé beaucoup de temps, des heures et des heures des jours et oui même des mois à la recherche de quelque chose de mieux que cela quand il s'agit de Firebase/FirebaseAuthClient et angularFire. Avec la façon dont le Firebase API et FireAuth API est, c'est très ennuyeux pour les faire jouer gentiment les uns avec les autres lors de leur utilisation avec angularFire de toute façon. C'est très frustrant, mais je l'ai apprise il enfin.
Si vous voulez vérifier le code de mon application et voir comment je fais ces choses plus complètement, vous pouvez le trouver dans cette branche de mon Webernote dépôt github.
Hésitez pas à forker, installer et l'exécuter localement, ou à y contribuer, même si vous le souhaitez. Je pourrais utiliser un peu m'aider 🙂
Espère que cela vous aide!!
Voici la façon dont je le fais.
Tout d'abord j'ai mon firebase service auth (je ne suis pas en utilisant Angularfire) que les appels off pour Seuls à gérer les connexions. Lorsque l'utilisateur les changements de statut de émissions de un événement.
Puis j'ai un "haut niveau" contrôleur qui ressemble après autorisation de l'état.
Enfin, j'utilise un utilisateur dédié service pour assurer l'état de l'utilisateur. (Il est encore en développement)
C'est très probablement due à l'async nature de l'appel. Pour y remédier il faudrait
$scope
dans l'usine de la fonction (similaire àangularFire
dépendance)$scope.$apply()
après l'affectationcurrentUser = user;
Une autre solution qui fonctionne pour moi:
account.service.js
some-component.controller.js
some-component.html