2013-03-05 12 views
6

Sto utilizzando Mozilla Persona su un progetto. Vorrei aggiornare loggedInUser dopo onlogin. Ma loggedInUser è un attributo di un oggetto passato a navigator.id.watch(). navigator.id.watch() è stato chiamato una volta (in un servizio AngularJS). Devo richiamarlo di nuovo, passando l'intero oggetto? Non sembra giusto. Ho sbagliato? = PCome aggiornare loggedInUser dopo onlogin in Mozilla Persona

Ecco il mio servizio:

app.factory('persona', function ($rootScope, $http) { 
navigator.id.watch({ 
    loggedInUser: null, 
    onlogin: function onlogin(assertion) { 
     console.log(this); 
     $http.post('/signIn', { assertion: assertion }) 
      .then(function (data, status, headers, config) { 
       $rootScope.$broadcast('signIn', data.data); 
      }, function (data, status, headers, config) { 
       $rootScope.$broadcast('signInError', data.data); 
      }); 
    }, 
    onlogout: function onlogout(param) { 
     $http.get('/signOut') 
      .then(function (data, status, headers, config) { 
       $rootScope.$broadcast('signOut', data.data); 
      }, function (data, status, headers, config) { 
       $rootScope.$broadcast('signOutError', data.data); 
      }); 
    } 
}); 

return { 
    signIn: function signIn() { 
     navigator.id.request(); 
    }, 
    signOut: function signOut() { 
     navigator.id.logout(); 
    } 
}; 
}); 
+1

Nella chiamata 'app.factory()' di cui sopra, è possibile cercare l'indirizzo e-mail dell'utente attualmente connesso e quindi inoltrarlo? Normalmente ciò che le persone fanno è che hanno il back-end in uscita l'indirizzo e-mail dell'utente attualmente loggato in modo che possa essere raccolto da ogni chiamata a 'navigator.id.watch()'. –

risposta

3

non puoi semplicemente fare loggedInUser diventare globale o almeno "a livello locale globale" al di sotto della stessa portata come metodo navigator.id.watch, proprio come il Esempio MDN?

Successivamente è possibile ottenere la risposta JSON dal servizio Persona, che contiene alcuni dati, inclusa l'e-mail. Così si potrebbe passare che i dati sulla vostra risposta AJAX e riempire la variabile loggedInUser

https://developer.mozilla.org/en-US/docs/Persona/Quick_Setup#Step_3.3A_Watch_for_login_and_logout_actions

var currentUser = '[email protected]'; 

navigator.id.watch({ 
    loggedInUser: currentUser, 
    onlogin: function(assertion) { 
    $.ajax({ 
     type: 'POST', 
     url: '/auth/login', // This is a URL on your website. 
     data: {assertion: assertion}, 
     success: function(res, status, xhr) { window.location.reload(); }, 
     error: function(xhr, status, err) { 
     navigator.id.logout(); 
     alert("Login failure: " + err); 
     } 
    }); 
    }, 
    onlogout: function() { 
    $.ajax({ 
     type: 'POST', 
     url: '/auth/logout', // This is a URL on your website. 
     success: function(res, status, xhr) { window.location.reload(); }, 
     error: function(xhr, status, err) { alert("Logout failure: " + err); } 
    }); 
    } 
}); 

JSON campione risposta da MDN:

{ 
    "status": "okay", 
    "email": "[email protected]", 
    "audience": "https://example.com:443", 
    "expires": 1308859352261, 
    "issuer": "eyedee.me" 
} 
+1

Ho dovuto andare avanti, quindi non sono ancora sicuro di come farlo al meglio, ma probabilmente è qualcosa come la tua risposta @chambs. È la natura della mia situazione "a una pagina" che mi confonde, suppongo. Tornerò ad esso alla fine ... Grazie! – slacktracer

0

Alla chiamata navigator.id.watch, impostare loggedInUser: localStorage.getItem('persona') || null (la null è importante), quindi, quando il login Persona ha esito positivo, fare localStorage.setItem('persona', theUserEmail), quando non è riuscito, fare localStorage.removeItem('persona').