2015-11-13 1 views
3

J'utilise Ember-simple-auth et j'essaie de renvoyer les données de mon authentificateur personnalisé dans le contrôleur qui a effectué l'authentification.Ember RSVP Promise resolve renvoie toujours une valeur indéfinie

dans mes authentificateur/custom.js:

authenticate(identification, password) { 
     return new Ember.RSVP.Promise(function (resolve, reject) { 
      var loginURL = 'https://domain.com/login';  
      var authObj = Ember.Object.create({"identity":identification,"password":password}); 
      var hash = authObj.getProperties('identity', 'password'); 
      var stringHash = JSON.stringify(hash); 

       var xhr = new XMLHttpRequest(); 
       xhr.open("post", loginURL); 
       xhr.onreadystatechange = handler; 
       xhr.responseType = 'json'; 
       xhr.setRequestHeader('Content-Type', 'application/json'); 
       xhr.setRequestHeader('Format', 'JSON'); 
       xhr.send(stringHash); 

       function handler() { 
       if (this.readyState === this.DONE) { 
        if (this.status === 200) { 
        console.log('response is: ',this.response); /// <-- returns good response data 
        resolve(this.response); 
        } else { 
         reject('failed with status: [' + this.status + ']'); 

        } 
       } 
      } 

et dans mon contrôleur de connexion:

authenticate() { 
    let { identification, password } = this.getProperties('identification', 'password'); 

    var session = this.get('session'); 
    session.authenticate('authenticator:custom', identification, password).then((reason) => { 
      console.log('failed login',reason); 
     }); 
    } 
}, 

Mais je voudrais vraiment être capable de gérer la fonction resolve et l'obtenir est value charge utile de la promesse authenticate.

Si je change le .catch à une .then la fonction de réponse est appelé avec succès, mais a toujours une valeur non définie comme charge utile:

session.authenticate('authenticator:custom', identification, password).then(
     (response) => { 
      console.log('response: ',response); //// <---- always 'undefined' 
      this.setUserWithData(response); 
     }, 
     (reason) => { 
      this.set('Login failed: ',reason); 
     }  

    );  
    } 

Même si je restructure la promesse, réorganiser la façon dont la fonction est appelée, la La première fonction d'un RSVP est appelée avec succès, mais a une charge utile non définie. La deuxième fonction d'un RSVP a toujours une charge utile correcte.

J'ai essayé inverser la résolution/rejeter:

Ember.RSVP.Promise(function (resolve, reject){ 

à

Ember.RSVP.Promise(function (reject, resolve){ 

et la fonction porte avec succès la réponse, mais le simple auth croit maintenant qu'elle n'a pas son autorisation. Je voudrais être en mesure de transmettre la charge utile de réponse dans mon contrôleur. Ou, si cela ne peut pas être fait, comment puis-je injecter des données de la réponse dans ma session et mon magasin de données de braises? Il ne semblait pas judicieux d'appeler et d'insérer des données dans le magasin à partir de la fonction d'authentification de l'authentificateur.

Répondre

2

La méthode authenticate de la session ne résout pas avec une valeur. Vérifiez les documents API: http://ember-simple-auth.com/api/classes/SessionService.html#method_authenticate

+0

Je vois. Ceci explique cela. Il semble cependant rompre la syntaxe attendue. Merci pour votre travail sur Simple-auth. Existe-t-il un exemple de création d'un authentificateur personnalisé? Tous les liens que vous avez précédemment publiés sur des exemples ne fonctionnent plus. Il est difficile de trouver les meilleures pratiques pour un authentificateur simple mais personnalisé. – jtf

2

Afin de gérer la réponse de la route d'authentification, j'ai utilisé la fonction sessionAuthenticated pour traiter les données renvoyées.

Ainsi, la fonction authenticate dans authenticators/custom.js

authenticate(identification, password) { 

     return new Ember.RSVP.Promise(function (resolve, reject) { 

      var loginURL = 'https://domain.com/login';  
      var authObj = Ember.Object.create({"identity":identification,"password":password}); 
      var hash = authObj.getProperties('identity', 'password'); 
      var stringHash = JSON.stringify(hash); 

       var xhr = new XMLHttpRequest(); 
       xhr.open("post", loginURL); 
       xhr.onreadystatechange = handler; 
       xhr.responseType = 'json'; 
       xhr.setRequestHeader('Content-Type', 'application/json'); 
       xhr.setRequestHeader('Format', 'JSON'); 
       xhr.send(stringHash); 

       function handler() { 
       if (this.readyState === this.DONE) { 
        if (this.status === 200) { 
        console.log('200 response: \r',this.response); 
        resolve(this.response); 
        } else { 
        console.log('failure response',this.response); 
         reject(this.response); 
        } 
       } 
      } 
     }); 

    }, 

Avec l'événement sessionAuthenticated() qui aura lieu à routes/application.js:

sessionAuthenticated: function(){ 
    var session = this.get('session'); 
    var data = session.get('data'); 
    var response = data.authenticated; 
    console.log('sessionAuthenticated()',response); 
}, 
sessionInvalidated: function(){ 
    console.log('sessionInvalidated()',response); 
}, 

De la fonction sessionAuthenticated, la variable response contient toutes les informations qui lui est passé de authenticate(response) à l'intérieur de l'authentificateur.