11

私が使う

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

ユーザーの作成時に確認メールを送信します。ただし、ユーザーがサインアップすると、メールを検証する前に製品に入ることが許可されます。これは望ましくありません。

ユーザーが検証されたときにtrueになるテンプレート変数を作成してハッキングしようとしましたが、テンプレートがレンダリングされた後にユーザー情報が到着し、Meteorでも発生します。setTimeout() データが到着したときにテンプレートを更新できませんでした。

これを行う適切な方法について何か提案はありますか?

送信

4

2 に答える 2

16

ログインを完全に停止するには、次のようにします。

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);
  }
});
于 2014-07-24T17:47:01.597 に答える
9

まず、データを「ハッキング不能」にする必要があります。公開機能を確認してください:http: //docs.meteor.com/#meteor_publish

したがって、製品のMeteor.publish関数では、次のようにする必要があります。

これにより、クライアントは、ログインしていて確認済みのアカウントを持っている場合にのみ製品を表示できます。彼らはまだログインできますが、アカウントが確認されるまで製品を見ることができません

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

生活を少し楽にするためにどの流星が使用するかを削除する必要がautopublishあることに注意してください。基本的にすべてのコレクションがユーザーに公開されますが、特定の情報を制限したいので、削除する必要があります

次に、テンプレートのデータを処理して、ユーザーがログインしていない場合にテンプレートのものが表示されないようにする必要があります。したがって、ブラウザが最初にロードされているそのステップでも、製品は表示されません。

クライアントJS

Meteor.subscribe("productinfo");

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

このようにして、テンプレートヘルパーは、ユーザーがログインしていて、確認済みのアカウントを持っているかどうかを確認します。さらに、クライアント側でコードが変更された場合、公開機能のために製品は表示されません。

于 2013-03-13T11:28:09.453 に答える