2013-03-13 6 views
11

używamSiła walidacji e-mail przed logowania meteor

Accounts.config({ 
    sendVerificationEmail: true, 
    forbidClientAccountCreation: false 
}) 

wysłać weryfikacji e-mail, gdy użytkownicy są tworzone. Jednak podczas rejestracji użytkowników są oni dopuszczani do produktu, zanim sprawdzą swoją pocztę, czego nie chcę.

Próbowałem go zhakować, tworząc zmienną szablonu, która jest prawdziwa, gdy użytkownik jest zweryfikowany, ale informacje o użytkowniku przybywają po wyrenderowaniu szablonu, a nawet przy użyciu Meteora. setTimeout() Nie byłem w stanie zaktualizować szablonu, gdy dane nadejdą.

Wszelkie sugestie dotyczące właściwego sposobu wykonania tej czynności?

Tx

Odpowiedz

9

Po pierwsze, trzeba wykonać dane „unhackable”, przyjrzeć się funkcji rozpatrzenie: http://docs.meteor.com/#meteor_publish

Więc w funkcji Meteor.publish dla danego produktu należy zrobić coś podobnego :

Dzięki temu klient może zobaczyć tylko produkt, jeśli jest zalogowany & mieć zweryfikowane konto. Nadal mogą się logować, ale nie widzą produktów, dopóki ich konto nie zostanie zweryfikowane:.

Server js

Meteor.publish("productinfo", function() { 
    user = Meteor.users.findOne({_id:this.userId}) 
    if(user) { 
     if(user.emails[0].verified) { 
      //You can put some extra logic in here to check which product the user has, if you're selling or something like that 
      return Products.find({}); 
     } 
    } 
}); 

Należy pamiętać trzeba usunąć autopublish który meteor używa, aby uczynić życie trochę łatwiejsze, to w zasadzie publikuje wszystkie zbiory w dół do użytkownika, ale chcesz ograniczyć pewne info, więc powinieneś go usunąć

Po drugie, musisz zająć się danymi w swoim szablonie, aby użytkownik, który nie jest zalogowany, nie był widoczny. Tak więc nawet w tym etapie, gdy przeglądarka jest początkowo ładowania nie będzie zobaczyć produkty

Client JS

Meteor.subscribe("productinfo"); 

Template.products.products = function() { 
    if(Meteor.userId()) { 
    if(Meteor.user().emails[0].verified) { 
     return Product.findOne({_id:"your product id"}); 
    } 
    } 
} 

ten sposób sprawdza szablon pomocnicze, jeśli użytkownik jest zalogowany & one zweryfikowane konto. Ponadto, jeśli kod został zmieniony po stronie klienta, nie zobaczyłby produktu z powodu funkcji publikowania.

+0

Awesome, wielkie dzięki! –

14

aby zatrzymać je zalogowaniu się w ogóle, można to zrobić:

Meteor.startup(function() { 
    if (Meteor.isServer) { 
    var loginAttemptVerifier = function(parameters) { 
     if (parameters.user && parameters.user.emails && (parameters.user.emails.length > 0)) { 
     // return true if verified email, false otherwise. 
     var found = _.find(
          parameters.user.emails, 
          function(thisEmail) { return thisEmail.verified } 
         ); 

     if (!found) { 
      throw new Meteor.Error(500, 'We sent you an email.'); 
     } 
     return found && parameters.allowed; 
     } else { 
     console.log("user has no registered emails."); 
     return false; 
     } 
    } 
    Accounts.validateLoginAttempt(loginAttemptVerifier); 
    } 
}); 
+2

Mimo że jest to stare pytanie, właśnie wdrożyłem rozwiązanie przez @cbberboy pomyślnie. – wiwa1978

Powiązane problemy