2013-03-05 24 views
6

Używam Mozilla Persona w projekcie. Chcę zaktualizować loggedInUser po onlogin. Ale loggedInUser jest atrybutem obiektu przekazanego do navigator.id.watch(). navigator.id.watch() został wywołany raz (w usłudze AngularJS). Czy powinienem ponownie zadzwonić, przekazując cały obiekt? To nie wydaje się właściwe. Czy się mylę? = PJak zaktualizować loggedInUser po zalogowaniu w Mozilla Persona

Oto mój serwis:

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

W powyższym wywołaniu 'app.factory()' można wyszukać adres e-mail aktualnie zalogowanego użytkownika, a następnie przekazać go? Zazwyczaj to, co ludzie robią, polega na tym, że mają wyjście z backendu, adres e-mail aktualnie zalogowanego użytkownika, dzięki czemu można go odebrać przy każdym wywołaniu funkcji 'navigator.id.watch()'. –

Odpowiedz

3

Nie można po prostu zrobić loggedInUser stać globalny lub przynajmniej „lokalnie globalny” pod takim samym zakresie jak metodę navigator.id.watch, podobnie jak Przykład MDN?

Po tym można uzyskać odpowiedź JSON z usługi Persona, która zawiera niektóre dane, w tym adres e-mail. Więc można przekazać te dane na swojej odpowiedzi AJAX i wypełnić zmienną 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); } 
    }); 
    } 
}); 

przykładową odpowiedź JSON z MDN:

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

Musiałem iść dalej, więc wciąż nie jestem pewien, jak najlepiej to zrobić, ale prawdopodobnie jest to coś w rodzaju twojej odpowiedzi @chambs. Wygląda na to, że moja sytuacja jest "jednostronicowa". Wrócę do tego w końcu ... Dziękuję! – slacktracer

0

Na wezwanie navigator.id.watch ustaw loggedInUser: localStorage.getItem('persona') || null (the null jest ważna), a następnie, gdy logowanie Persona zakończy się powodzeniem, wykonaj localStorage.setItem('persona', theUserEmail), gdy się nie powiedzie, wykonaj localStorage.removeItem('persona').