2016-08-23 15 views
6

Tôi đang cố gắng xây dựng địa chỉ email xác nhận cho người dùng, để xác minh email của họ là có thật. Tôi nên sử dụng gói nào để xác nhận địa chỉ email của người dùng. Cho đến nay Im sử dụng cầy mangut và bày tỏlàm cách nào để xác nhận địa chỉ email bằng Express/node?

Mã số Ví dụ

var UserSchema = new mongoose.Schema({ 
    email: { type: String, unique: true, lowercase: true } 
    password: String 
}); 

var User = mongoose.model('User', UserSchema); 

app.post('/signup', function(req, res, next) { 
    // Create a new User 
    var user = new User(); 
    user.email = req.body.email; 
    user.password = req.body.password; 
    user.save(); 
}); 

Trong mã app.post, làm thế nào để xác nhận địa chỉ email của người dùng?

+0

Trước hết, xác thực email nhập là một chuỗi email hợp lệ. –

+0

Sau đó, có một thuộc tính được gọi là "emailValidated" trong Mô hình người dùng. Gửi email đến email đã gửi kèm theo liên kết duy nhất được đính kèm với email. Nếu liên kết đó được truy cập, hãy đặt "emailValidated" thành true. Chỉ có thể truy cập liên kết nếu người dùng có thể truy cập email được cung cấp, do đó xác nhận email của người dùng. –

Trả lời

34

Điều bạn đang tìm kiếm được gọi là "xác minh tài khoản" hoặc "xác minh email". Có rất nhiều các module Node có thể thực hiện điều này, nhưng nguyên tắc đi như thế này:

  • mô hình tài khoản của bạn nên có một thuộc tính active đó là false theo mặc định
  • Khi người dùng gửi một mẫu đăng ký hợp lệ, tạo một tài khoản mới (ai là active sẽ false ban đầu)
  • Tạo một hash ngẫu nhiên và lưu nó trong cơ sở dữ liệu của bạn với một tham chiếu đến User ID
  • Gửi email đến địa chỉ email đã cung cấp với giá trị băm như là một phần của một liên kết trỏ trở lại một tuyến đường trên máy chủ của bạn
  • Khi người dùng nhấp vào liên kết và truy cập tuyến đường của bạn, kiểm tra các hash thông qua trong URL
  • Nếu băm tồn tại trong cơ sở dữ liệu, có người sử dụng liên quan và thiết lập thuộc tính active của họ để true
  • Xóa băm từ cơ sở dữ liệu, nó không còn cần thiết

Người dùng của bạn hiện đã được xác minh.

-3

Sự cố của bạn có thể được giải quyết bằng express-validator.

Tôi cũng đang sử dụng cùng một thư viện và rất hữu ích để xác định xác thực trong chính tuyến đường của mình.

.isEmail() trường ở đó để xác thực email.

Chỉ cần làm npm install express-validator

expressValidator = require('express-validator'); 

app = express.createServer(); 

app.use(express.bodyParser()); 
app.use(expressValidator([options])); 

var UserSchema = new mongoose.Schema({ 
    email: { type: String, unique: true, lowercase: true } 
    password: String 
}); 

var User = mongoose.model('User', UserSchema); 

app.post('/signup', function(req, res, next) { 

    req.checkBody('email', 'Invalid email').notEmpty().isEmail(); 

    var user = new User(); 
    user.email = req.body.email; 
    user.password = req.body.password; 
    user.save(); 
}); 
+0

Tôi nghĩ rằng OP đang hỏi cách gửi email xác nhận tài khoản, không xác nhận rằng chuỗi là một email. – Soviut

+0

@Soviut, có thể bạn đã đúng, vì điều đó anh ta có thể sử dụng 'node-smtp' để gửi thư và xác minh, nhưng nó sẽ là một dịch vụ hoàn toàn mới, có thể là câu hỏi không rõ ràng. –

+0

tắt câu trả lời của chủ đề. –

7
var express=require('express'); 
var nodemailer = require("nodemailer"); 
var app=express(); 
/* 
    Here we are configuring our SMTP Server details. 
    STMP is mail server which is responsible for sending and recieving email. 
*/ 
var smtpTransport = nodemailer.createTransport("SMTP",{ 
    service: "Gmail", 
    auth: { 
     user: "Your Gmail ID", 
     pass: "Gmail Password" 
    } 
}); 
var rand,mailOptions,host,link; 
/*------------------SMTP Over-----------------------------*/ 

/*------------------Routing Started ------------------------*/ 

app.get('/',function(req,res){ 
    res.sendfile('index.html'); 
}); 
app.get('/send',function(req,res){ 
     rand=Math.floor((Math.random() * 100) + 54); 
    host=req.get('host'); 
    link="http://"+req.get('host')+"/verify?id="+rand; 
    mailOptions={ 
     to : req.query.to, 
     subject : "Please confirm your Email account", 
     html : "Hello,<br> Please Click on the link to verify your email.<br><a href="+link+">Click here to verify</a>" 
    } 
    console.log(mailOptions); 
    smtpTransport.sendMail(mailOptions, function(error, response){ 
    if(error){ 
      console.log(error); 
     res.end("error"); 
    }else{ 
      console.log("Message sent: " + response.message); 
     res.end("sent"); 
     } 
}); 
}); 

app.get('/verify',function(req,res){ 
console.log(req.protocol+":/"+req.get('host')); 
if((req.protocol+"://"+req.get('host'))==("http://"+host)) 
{ 
    console.log("Domain is matched. Information is from Authentic email"); 
    if(req.query.id==rand) 
    { 
     console.log("email is verified"); 
     res.end("<h1>Email "+mailOptions.to+" is been Successfully verified"); 
    } 
    else 
    { 
     console.log("email is not verified"); 
     res.end("<h1>Bad Request</h1>"); 
    } 
} 
else 
{ 
    res.end("<h1>Request is from unknown source"); 
} 
}); 

/*--------------------Routing Over----------------------------*/ 

app.listen(3000,function(){ 
    console.log("Express Started on Port 3000"); 
}); 

Thực hiện theo các mã ví dụ, bạn có thể sử dụng nodemailer để gửi liên kết, và sau đó xác nhận nó. Đây là liên kết: https://codeforgeek.com/2014/07/node-email-verification-script/

+0

Tôi không thể hiểu tại sao bạn kiểm tra xem máy chủ và giao thức có giống nhau hay không. Không phải là nếu họ không phải là cùng một yêu cầu thậm chí sẽ không đến được máy chủ của chúng tôi? –

1

nếu bạn đang chỉ là thử nghiệm trên máy tính địa phương của bạn, một trong những cách đơn giản để tìm hiểu làm thế nào để làm điều đó có thể là:

Giả sử bạn đã biết gửi mail thông qua nodemailer ..

Khi dùng đăng lên, sau khi lưu trữ dữ liệu đăng ký trong cơ sở dữ liệu của bạn, phía máy chủ của bạn nhận email người dùng từ dữ liệu đăng ký nhận được và số được tạo ngẫu nhiên và tạo url tùy chỉnh với địa chỉ trang nơi người dùng sẽ được hướng dẫn sau khi họ nhấp vào liên kết được đưa ra trong thư.

var customUrl = "http://"+ your host + "/" + your verification web-page + "?email=" + userEmail + "&id=" + randomNumber; 

Một ví dụ có thể là:

var userEmail = [email protected] 
var host = localhost:8080 
var directWebPage = verifyUserEmail.html 
var randomNumber = // generate with math.random() // lets say 111 

Đưa ở trên định dạng của customUrl nó trông giống như sau

customUrl:http://localhost:8080/[email protected]&id=111 

Lưu customUrl này ở đâu đó (có thể là trong cơ sở dữ liệu của bạn) Bây giờ, gửi email cho người dùng có phần thân email chứa liên kết cutomUrl này.

<a href="customUrl">Click to verify your email</a> 

Khi người dùng nhấp vào liên kết anh/cô ấy sẽ được dẫn đến verifyUserEmail.html trang và khi điều đó xảy ra, bạn có thể trích xuất các trang url chứa emailid thông tin

Ví dụ: trong ang ular tôi đi như this-

var urlVerifyData = $location.url(); or $location.absUrl(); 

Bây giờ giải nén email dạng urlVerifyData chuỗi sử dụng javascript phương pháp chuỗi

Yêu cầu máy chủ của bạn với email nàyurlVerifyData

Bây giờ truy vấn cơ sở dữ liệu của bạn cho email này và xác minh được lưu trữ trước đó customUrl với người dùng urlVerifyData

Nếu chúng phù hợp, hola! Bạn có cho mình một người dùng chính hãng !!!

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