2013-03-13 37 views
11

tôi sử dụngForce xác nhận email trước khi đăng nhập sao băng

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

để gửi xác minh qua email khi người dùng được tạo ra. Tuy nhiên, khi người dùng đăng ký, họ được phép vào sản phẩm trước khi họ xác thực thư của họ mà tôi không muốn.

Tôi đã thử hack bằng cách tạo biến mẫu đúng khi người dùng được xác minh, nhưng thông tin người dùng đến sau khi mẫu được hiển thị và thậm chí với Meteor. setTimeout() Tôi đã không thể cập nhật mẫu khi dữ liệu đến.

Bất kỳ đề xuất nào về cách thích hợp để thực hiện việc này?

Tx

Trả lời

9

Trước hết, bạn biết bạn cần phải thực hiện dữ liệu của bạn 'unhackable', có một cái nhìn tại các chức năng xuất bản: http://docs.meteor.com/#meteor_publish

Vì vậy, trong chức năng Meteor.publish của bạn cho sản phẩm của bạn, bạn nên làm một cái gì đó như :

Điều này đảm bảo khách hàng chỉ có thể xem sản phẩm nếu họ đăng nhập & có tài khoản được xác minh. Họ vẫn có thể đăng nhập nhưng không thể xem các sản phẩm cho đến khi tài khoản của họ được xác minh.

máy chủ 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({}); 
     } 
    } 
}); 

Hãy nhớ bạn cần phải loại bỏ autopublish mà sao băng sử dụng để làm cho cuộc sống một chút dễ dàng hơn, nó về cơ bản công bố tất cả các bộ sưu tập xuống cho người dùng, nhưng bạn muốn hạn chế nhất định nên bạn nên xóa nó

Thứ hai bạn cần xử lý dữ liệu trên mẫu của mình để nếu người dùng không đăng nhập nội dung mẫu không hiển thị. Vì vậy, ngay cả trong bước mà khi trình duyệt ban đầu được nạp họ sẽ không thấy các sản phẩm

Khách hàng JS

Meteor.subscribe("productinfo"); 

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

Bằng cách này, kiểm tra mẫu helper nếu người dùng đang đăng nhập & họ có một xác nhận tài khoản. Ngoài ra nếu mã đã được thay đổi ở phía máy khách, họ sẽ không thấy sản phẩm vì chức năng xuất bản.

+0

Awesome, thanks a lot! –

14

Để ngăn chặn chúng cách đăng nhập vào tất cả, bạn có thể làm điều này:

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

Mặc dù đó là một câu hỏi cũ, tôi chỉ thực hiện giải pháp bởi @cobberboy thành công. – wiwa1978

Các vấn đề liên quan