IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AngularJS Discussion :

Authentification avec Firebase


Sujet :

AngularJS

  1. #1
    Invité
    Invité(e)
    Par défaut Authentification avec Firebase
    Bonjour,

    Quelqu'un connait-il Firebase ?

    j'ai un problème, j'ai ajouté des droits en lecture et écriture sur mon modèle de données VILLES pour un utilisateur identifié, dans le dashboard de Firebase comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      "rules": {
        "villes": {
           ".read": "auth != null && data.child('user_id').val() === auth.uid",
          ".write": "auth != null && newData.child('user_id').val() === auth.uid"
        },
         "users": {
                ".write": true,
                "$uid": {
                    ".read": "auth != null && auth.uid == $uid"
                }
            }
      }

    J'ai mon controleur d'identifaction qui marche bien et qui authentifie correctement les utilisateurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <!-- AUTHENTIFICATION PAR MOT DE PASSE -->
    			app.controller("AuthControllerPwd", ["$scope", "$firebaseAuth",
    				  function($scope, $firebaseAuth) {
    					var ref = new Firebase("https://blinding-heat-8502.firebaseio.com/");
    					$scope.authObj = $firebaseAuth(ref);
     
    					$scope.login = function() {
    					  $scope.authData = null;
    					  $scope.error = null;
     
    					  $scope.authObj.$authWithPassword({
    						  	email: $scope.email,
    							password: $scope.password
    						}).then(function(authData) {
    						  console.log("Logged in as:", authData.uid);
    						  $scope.message2 = "Logged in as:", authData.uid;
    						  $scope.log = authData.uid;
     
    						}).catch(function(error) {
    						  console.error("Authentication failed:", error);
    						  $scope.error = error;
    						});
    					};
    				  }
    			]);
    Mais lorsque je veux voir mes villes dans mon application, je ne vois rien s'afficher après le login, cela cache ou ne charge pas le modèles de données.

    Le reste de l'application est basé sur ce controleur principal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    app.controller('appCtrl', ['$scope','VillesService','$http', function ($scope,VillesService,$http) {
     
    	/* INITIALISATION DU FORMULAIRE */
    	$scope.newVille 		= {}; // Tout ce que l'on inscrit dans le formulaire est copié dans cet objet en temps réel.
    	$scope.newVille.photo 	= "img-app/ville.jpg" // Image de base d'une ville que l'on modifie après après telechargement et update dans l'objet newVille
     
    	/* INITIALISATION DES ONGLETS (ON CHOISIT QUEL ONGLET SERA VU EN PREMIER) */
    	$scope.etatOnglets 			= {static0:true,static1: false, static2: false};
     
    	/* CHARGEMENT DU MODELE DE DONNEES SUR FIREBASE ET LIAISON PERMANENTE TRI-DIRECTIONNELLE A LA BASE DE DONNEE EN TEMPS REEL !(3 way binding): */
    	$scope.villes 			= VillesService.getVilles(); // $scope.villes est affiché en temps réel dans la vue, c'est un tableau d'objets Json contenant des villes.
     
    	$scope.getInfos = function(){
     
    		return $scope.villes.length;
     
    	}
     
    	/* REINITIALISATION DU FORMULAIRE POUR CREER UNE NOUVELLE VILLE */
    	$scope.nouveau = function(){
    		$scope.newVille 		= {}; // Tout ce que l'on inscrit dans le formulaire est copié dans cet objet en temps réel.
    		$scope.newVille.photo 	= "img-app/ville.jpg"
    	}
     
    	/* AJOUT D'UNE VILLE ET ENREGISTREMENT EN BASE DE DONNEES FIREBASE : */
    	$scope.ajouterVille = function(){
    		VillesService.ajouterVille(angular.copy($scope.newVille));// transmets l'objet ville à la base de données firebase suite à un click sur enregistrer la ville...
    		$scope.infos = "La ville a été ajoutée en ligne à la base de données FIREBASE"
    	}
     
    	/* SUPPRESSION D'UNE VILLE */
    	$scope.supprimerVille = function(ville){
    		alert('Je préfère garder les données de démo, coquin !')
    		/* VillesService.supprimerVille(ville); */
    	}
     
    	/* EDITION DUNE VILLE */
    	$scope.editerVille = function(ville){
    		/* FOCUS SUR L ONGLET EDITION */
    		$scope.etatOnglets 		= {};
    		$scope.etatOnglets 		= {static1: false, static2: true}; // Permet de placer automatiquement lutilisateur sur l'onglet EDITER
     
    		/* POUR POUVOIR EDITER UN OBJET IL FAUT LE RECUPERER SUR FIREBASE CA DOIT ETRE UN OBJET FIREBASE , DU COUP ON UTILISE GETRECORD COMME INDIQUE DANS LA DOC: */
    		$scope.newVille  		=  $scope.villes.$getRecord(ville.$id); // Astuce permettant de charger l'objet ville directement dans le formulaire : super rapide, super simple !
    	}
     
    	/* VALIDATION DE L EDITION DUNE VILLE  */
    	$scope.validerEdition = function(){
    		VillesService.editerVille($scope.newVille);
    		$scope.infos = "La ville a été modifiée en ligne dans la base de données FIREBASE"
     
    	}
     
    	/* CHARGEMENT D UNE PHOTO SUR LE SERVEUR */
    	$scope.uploadFile = function(files) {
     
    		var fd = new FormData();
    			//Take the first selected file
    			fd.append("file", files[0]);
    			console.log(files[0].name);
    			var uploadUrl = "uploadTruc36.php";
    			$http.post(uploadUrl, fd, {
    				withCredentials: true,
    				headers: {'Content-Type': undefined },
    				transformRequest: angular.identity
    			}).success(function(data){ 
    				$scope.infoUpload="Fichier téléchargé sur le serveur "; 
    				$scope.newVille.photo="uploads/"+files[0].name; 
    				})
    				.error(function(data){
    					$scope.infoUpload="Echec du téléchargement sur le serveur";
    				});
     
    	};
     
     
     
    <!-- FIN DU CONTROLEUR	 -->
    }])
    Ai-je raté une étape ?
    Dernière modification par NoSmoking ; 01/02/2016 à 18h30. Motif: Suppression mot problème dans titre.

  2. #2
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Bonjour,

    Citation Envoyé par devwebsympa Voir le message
    cela cache ou ne charge pas le modèles de données.
    Entre cacher et ne pas charger, il y a une différence notable.

    Qu'as-tu comme erreur ?
    Que te renvoie le serveur ? (j'imagine que tu interroge directement la base, et donc dans ce cas : "que te renvoie la base ?").
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup de m'avoir répondu !

    Ben, en fait réussir à me logguer puis obtenir mes modèles de données en fonction des droit du login utilisateur est pour moi le Graal... Mais voilà comme c'est compliqué !

    Donc, lorsque je lance l'application web, j'ai ce message dans ma console qui s'affiche, avant d'être loggé, ce qui est normal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Error: permission_denied: Client doesn't have permission to access the desired data.
    rf/<.H@https://cdn.firebase.com/js/client/2.2.1/firebase.js:115:273
    Bh/this.N<.Pe/<@https://cdn.firebase.com/js/client/2.2.1/firebase.js:193:85
    ph/<@https://cdn.firebase.com/js/client/2.2.1/firebase.js:178:222
    h.Bd@https://cdn.firebase.com/js/client/2.2.1/firebase.js:182:104
    Zg.prototype.Bd@https://cdn.firebase.com/js/client/2.2.1/firebase.js:174:359
    ah/<@https://cdn.firebase.com/js/client/2.2.1/firebase.js:172:279
    Ug@https://cdn.firebase.com/js/client/2.2.1/firebase.js:166:462
    Rg.prototype.open/this.ua.onmessage@https://cdn.firebase.com/js/client/2.2.1/firebase.js:165:245
    cela signifie que je n'ai pas les droits de lire mon modèle de données "VILLES" présent sur Firebase, ce qui est normal puisque je ne suis pas encore loggé !

    Seulement, quand une fois loggé correctement avec log: test30@test.fr pass: test, qui est un utilisateur créé et qui apparait dans le dashboard de Firebase, cela ne change rien, mon modèle ne s'affiche toujours pas.


    Dans ma console j'ai seulement ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Logged in as: 77ef4d02-322b-487d-975e-9c834dd43b45

    J'ai cru comprendre qu'il existait une fonction onAuth(), mais selon moi les droits devraient s'appliquer immédiatement.


    Je me demande si c'est parce que c'est 2 controleurs séparés que cela ne fonctionne pas. C'est sacrément compliqué. Merci.

    Je suis à la recherche de démonstrations sur le Web, mais c'est sacrément compliqué. Si quelqu'un connait Firebase, n'hésitez pas ce serait sympa merci , bise.


    EDIT : j'ai essayé directement de charger mon modèle avec la fonction onAuth() dans mon controleur d'authentification, rien à faire ça me dit que je n'ai pas les droits d'accéder à mon modèle "VILLES" après l'authentification, je pense que mes rules ne doivent pas êtres bien écrit dans le dashboard de firebase comme inscrit au début du post !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    	<!-- AUTHENTIFICATION PAR MOT DE PASSE -->
    			app.controller("AuthControllerPwd", ["$scope", "$firebaseAuth",'$firebaseArray',
    				  function($scope, $firebaseAuth,$firebaseArray) {
    					var ref = new Firebase("https://blinding-heat-8502.firebaseio.com/villes");
    					$scope.authObj = $firebaseAuth(ref);
     
    					$scope.login = function() {
    					  $scope.authData = null;
    					  $scope.error = null;
     
    					  $scope.authObj.$authWithPassword({
    						  	email: $scope.email,
    							password: $scope.password
    						}).then(function(authData) {
    						  console.log("Logged in as:", authData.uid);
    						  $scope.message2 = "Logged in as:", authData.uid;
    						  $scope.log = authData.uid;
     
    						}).catch(function(error) {
    						  console.error("Authentication failed:", error);
    						  $scope.error = error;
    						});
     
     
     
    						$scope.authObj.$onAuth(function(authData) {
    						  if (authData) {
    							  console.log("test");
    							console.log("Logged in as:", authData.uid);
    							var ref = new Firebase("https://blinding-heat-8502.firebaseio.com/villes");
    							$scope.villes  = $firebaseArray(ref);
    							var j = $scope.villes;
    							console.log(j);
    						  } else {
    							console.log("Logged out");
    						  }
    						});
     
     
     
    					};
    				  }
    			]);

    En attendant de trouver une réponse, je vais faire ce tuto qu'on peut traduire en français dans le menu déroulant :

    http://code.tutsplus.com/fr/tutorial...pdown-language
    Dernière modification par Invité ; 03/02/2016 à 12h15.

  4. #4
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Citation Envoyé par devwebsympa Voir le message
    Seulement, quand une fois loggé correctement avec log: test30@test.fr pass: test, qui est un utilisateur créé et qui apparait dans le dashboard de Firebase, cela ne change rien, mon modèle ne s'affiche toujours pas.
    Essaie d'envoyer une requête à la base en dehors d'Angular (avec un client REST) et vois si tu arrive à avoir une réponse correcte (liste des villes).

    Citation Envoyé par devwebsympa Voir le message
    J'ai cru comprendre qu'il existait une fonction onAuth()
    Pas dans angular mais dans firebase. Et dans ce cas, il faudrait voir la doc de fireBase.


    EDIT:
    Citation Envoyé par devwebsympa Voir le message
    EDIT : j'ai essayé directement de charger mon modèle avec la fonction onAuth() dans mon controleur d'authentification, rien à faire ça me dit que je n'ai pas les droits d'accéder à mon modèle "VILLES" après l'authentification, je pense que mes rules ne doivent pas êtres bien écrit dans le dashboard de firebase comme inscrit au début du post !
    Ce n'est donc pas un problème angular...
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ca y est j'ai finalement résolu le problème...

    Phase 1 : inscrire ces rules dans le dahsboard de Firebase :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {"rules": 
             {"villes": {
                         ".read": "auth != null",
                         ".write": "auth != null"}
             }
    }
    Explication : Les rules permettent d'attribuer ou pas des droits sur nos modèles de données présents sur Firebase.

    En l'occurence, plus haut, j'interdis la lecture et l'écriture de mon modèle de données VILLES, si la variable auth( qui est déclenché par le système d'identification de firebase) n'est pas active.

    Autrement dit, pas de droits de lecture ou d'écriture si l'on est pas loggé sur firebase auparavant.

    Le système semble relativement simple, une fois que l'on a compris. Le module qui s'occupe de ça est à injecter dans notre controleur, il s'appelle $firebaseAuth



    SECOND :
    Sous l'onglet Login et Auth du dahsboard de Firebase, régler la durée de session sur 25 secondes, et voir la magie s'opérer :

    Quand un user n'est pas loggé, il ne peut pas voir le contenu du modèle de données "VILLES", par contre, dès qu'il se loggue, il obtient les précieuses données.

    En l'occurence, dans mon exemple, on voit qu'au bout de 25 secondes, les données disparraissent de l'écran hi hi hi ! , vu que l'utilisateur est automatiquement déloggué par firebase, la liaison tridirectionnelle s' occupe du reste.

    Voici mon code complet au cas ou ça serve à quelqu'un, et un exemple ici :

    Partie Html :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <body ng-controller="appCtrl">
    	<h2>S'identifier anonymement</h2><br>
    	<div >
    	  <button ng-click="login()">S'identifier anonymement</button>
    		<p ng-if="authData">Utilisateur Loggé: <strong>{{ authData.uid }}</strong></p>
    	  <p ng-if="error">Erreur: <strong>{{ error }}</strong></p>
    	</div>
     
    	<div  ng-repeat="ville in villes"  >
    		<h4>{{ville.nom| uppercase}}</h4>
    	</div> 
    </body>
    Partie AngularJs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    var app = angular.module('app', ['firebase'])
    app.controller('appCtrl', ['$scope','$firebaseArray', "$firebaseAuth", function ($scope,$firebaseArray, $firebaseAuth) {
     
     
     
     
    					$scope.login = function() {
    						var ref = new Firebase("https://blinding-heat-8502.firebaseio.com"); 
    					auth = $firebaseAuth(ref);
    					  $scope.authData = null;
    					  $scope.error = null;
     
    					  auth.$authAnonymously().then(function(authData) {
    						$scope.authData = authData;
    						$scope.villes = $firebaseArray(ref.child('villes'));
     
    					  }).catch(function(error) {
    						$scope.error = error;
     
    					  });
    					};
     
     
     
     
    <!-- FIN DU CONTROLEUR	 -->
    }])
    Mon modèle de données villes qui est un tableau de Json stocké sur firebase en ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    villes {
       {
       id:-K7RMScvACBfJC_ebW1p  
       name : New York
       }
    }

    P.S : l'utilisateur peut aussi se logger avec LOGIN MDP ou Google ou Facebook etc .... Et ce qui déchire... C'est la liaison tri-directionnelle des données !! BYE BYE le BACK END et les requêtes sql à rallonge (Quoi que ça a l'air ben compliqué parfois de filtrer avec Firebase et angular !)
    Dernière modification par Invité ; 09/02/2016 à 10h35.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Mon post d'études sur mon wordpress :
    https://nicolashcodes.wordpress.com/...osql-firebase/

    Je vais maintenant voir pour attribuer des droits en fonction d'un attribut Json dans le modèle de données...
    Dernière modification par Invité ; 09/02/2016 à 10h11.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Page d'authentification avec jsp
    Par taroudant dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 19/07/2006, 09h24
  2. prob d'authentification avec Java Script !!!!!
    Par King_T dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 10/05/2006, 19h18
  3. Réponses: 2
    Dernier message: 10/05/2006, 07h50
  4. Pas de fenètre d'authentification avec .htaccess
    Par damjal dans le forum Apache
    Réponses: 2
    Dernier message: 02/11/2005, 08h40
  5. [MySQL] mécanisme d'authentification avec BD
    Par lalyly dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 16/10/2005, 13h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo