2014-12-02 1 views
1

Может ли кто-нибудь указать правильный метод отправки проверки по электронной почте при создании пользователя? Это важная часть ...Meteor: Accounts.sendVerificationEmail поведение по настройке

a) Я хотел бы, чтобы у пользователя был немедленный доступ при регистрации. Но если пользователь еще не нажал кнопку клика по ссылке подтверждения в течение 48 часов, я бы хотел запретить им войти в систему, пока они не нажмут на ссылку.

Мой код до сих пор отправляет подтверждение по электронной почте, но у пользователя есть непрерывный доступ к приложению с кликом или без ссылки на ссылку для подтверждения (так что мой код, конечно, неполный).

client.js

Template.join.events({ 
'submit #join-form': function(e,t){ 
e.preventDefault(); 
    var firstName= t.find('#join-firstName').value, 
    lastName= t.find('#join-lastName').value, 
    email = t.find('#join-email').value, 
    password = t.find('#join-password').value, 
    username = firstName.substring(0) + '.' + lastName.substring(0), 
    profile = { 
    fullname: firstName + ' ' + lastName 
    }; 
    Accounts.createUser({ 
    email: email, 
    username: username, 
    password: password, 
    userType: // 'reader' or 'publisher' 
    createdAt: new Date(), 
    profile: profile 
}, function(error) { 
if (error) { 
    alert(error); 
} else { 
    Router.go('home'); 
     } 
    }); 
    } 
}); 

server.js

Meteor.startup(function() { 
process.env.MAIL_URL = 'smtp://postmaster.....'; 
Accounts.emailTemplates.from = "[email protected]"; 
Accounts.emailTemplates.sitename = "My SIte Name"; 

Accounts.emailTemplates.verifyEmail.subject = function(user) { 
    return 'Please confirm tour Email address' ; 
}, 
Accounts.emailTemplates.verifyEmail.text = function(user, url) { 
    return 'Click on the link below to verify your address: ' + url; 
} 
Accounts.config({ 
    sendVerificationEmail: true 
}); 

Моя попытка была сделана за счет собственных показаний на метеорных документы и глядя на другого кода на SO. Я застрял. Спасибо за поддержку.

ответ

2

Я думаю, что основная идея заключается в том, чтобы иметь некоторый код проверки, например, в Accounts.validateLoginAttempt, который вы хотите проверить каждый раз перед входом пользователя. То, что вы можете сделать, это сохранить время даты & когда пользователь подписывает в user.profile.joinDate. Если пользователь пытается войти в

  • Проверьте, если адрес электронной почты был проверен или
  • проверить, если пользователь входа в льготный период 48 часов
isWithinGracePeriod = function(user) { 
     ** TBD returning true or false. 
     This can be tricky when you 
     have multiple instances in 
     different time-zones. 
     ** } 

и

Accounts.validateLoginAttempt(function(attempt){ 
    if (attempt.user && attempt.user.emails && !attempt.user.emails[0].verified) { 
    console.log('No verification action received yet.'); 
    return isWithinGracePeriod(attempt.user); 
    } 
    return true; 
}); 

Кроме того, здесь есть HTML/spacebars материал:

<body> 
    {{ > start }} 
</body> 

<template name="start"> 
    {{#if currentUser}}{{>showUserProfile}}{{else}}{{> login}}{{/if}} 
</template> 

<template name="login"> 
    ## Grab username/password here 
</template> 

Если login шаблон создан, мы можем попытаться захватить код после того, как пользователь нажал на ссылку для подтверждения. Обратите внимание, что, если ни один пользователь не вошел в систему, то login будет оказана, поэтому мы придаем login через

Template.login.created = function() { 
    if (Accounts._verifyEmailToken) { 
    Accounts.verifyEmail(Accounts._verifyEmailToken, function(err) { 
     if (err != null) { 
     if (err.message = 'Verify email link expired [403]') { 
      var message ='Sorry this verification link has expired.'; 
      console.log(message);  
      alertBox = Blaze.renderWithData(Template.Alert, {message: message}, $("body").get(0)); 
     } 
     } else { 
     var message = "Thank you! Your email address has been confirmed."; 
     console.log(message); 
     alertBox = Blaze.renderWithData(Template.Alert, {message: message}, $("body").get(0)); 
     } 
    }); 
    } 
}; 

Ссылка проверка отправить в «крюк» в Accounts.createUser:

Accounts.onCreateUser(function(options, user) { 
    user.profile = {}; 
    Meteor.setTimeout(function() { 
    Accounts.sendVerificationEmail(user._id); 
    }, 2 * 3000); 
    return user; 
}); 
+0

Чтобы быть справедливым 48-часовой льготный период не должен быть настолько строгим. Пока есть подтверждение с адресом электронной почты пользователей в какой-то момент. Я видел, что с Accounts.validateLoginAttempt существует «разрешенная» функция обратного вызова, которая возвращает либо true, либо false. Во-первых, можете ли вы показать мне, как установить LoginWithEmail. Я не понимаю, что он делает, когда пользователь нажимает на ссылку. +1 для методического подхода к вопросу, спасибо Steffo – meteorBuzz

+0

Переделал ответ. Когда пользователь нажимает ссылку подтверждения (которая выглядит так: http: // localhost: 3000/#/verify-email/lots-of-funny-chars), создается шаблон 'login' и' Accounts.verifyEmail' захватывает смешные -chars и проверяет их (Meteor заботится об этом). – Steffo

+0

Спасибо за ввод. Я буду применять этот код и дам вам знать, как скоро я поеду и проголосую. – meteorBuzz