2

ユーザーの作成時に電子メール検証を送信する正しい方法を誰か提供してもらえますか? これは重要な部分です...

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

サーバー.js

Meteor.startup(function () {
process.env.MAIL_URL = 'smtp://postmaster.....';
Accounts.emailTemplates.from = "no-reply@mydomain.com";
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 の他のコードを調べたりして行われました。私は立ち往生しています。ご支援ありがとうございます。

4

1 に答える 1

3

基本的な考え方は、たとえば、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/スペースバーのものは次のとおりです。

<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;
});
于 2014-12-02T16:05:44.657 に答える