2013-03-13 14 views
11

Io usoForza convalida e-mail prima login meteora

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

di inviare una e-mail di verifica quando vengono creati gli utenti. Tuttavia, quando gli utenti si registrano, sono ammessi nel prodotto prima che convalidino la loro posta, che non desidero.

Ho tentato di hackerarlo creando una variabile modello vera quando l'utente è verificato, ma le informazioni utente arrivano dopo che il modello è stato renderizzato, e anche con un Meteor. setTimeout() Non sono stato in grado di aggiornare il modello quando arriva il dato.

Qualche suggerimento per il modo corretto di farlo?

Tx

risposta

9

In primo luogo, si è necessario rendere i dati 'unhackable', date un'occhiata alle funzioni di pubblicare: http://docs.meteor.com/#meteor_publish

Quindi nel tuo funzione Meteor.publish per il vostro prodotto si dovrebbe fare qualcosa di simile :

Ciò consente al client di vedere il prodotto solo se è stato effettuato il login in & con un account verificato. Possono ancora accedere ma non possono vedere i prodotti fino a quando il loro account non viene verificato.

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({}); 
     } 
    } 
}); 

Tenete a mente è necessario rimuovere autopublish che meteora utilizza per rendere la vita un po 'più facile, pubblica praticamente tutte le collezioni verso il basso per l'utente, ma si desidera limitare certi info quindi è necessario rimuoverlo

In secondo luogo è necessario gestire i dati sul modello in modo che se l'utente non ha effettuato l'accesso nel modello non è visibile. Quindi, anche in quel passo quando il browser viene inizialmente caricando non vedranno i prodotti

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"}); 
    } 
    } 
} 

In questo modo i controlli del modello di supporto se l'utente è connesso & hanno un verificato account. Inoltre, se il codice è stato modificato sul lato client, non vedrebbe il prodotto a causa della funzione di pubblicazione.

+0

impressionante, grazie mille! –

14

per fermarli accedendo a tutti, si potrebbe fare questo:

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

Sebbene sia una vecchia domanda, ho appena implementato la soluzione con successo con @cobberboy. – wiwa1978

Problemi correlati