- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
Kích hoạt tài khoản qua email (Email activation) thường gặp khi chúng ta đăng ký nick trên diễn đàn, hay một website uy tín nào đó. Hoặc bạn đang xây dựng ứng dụng với tính năng membership. Cách này phù hợp nhất nếu bạn muốn kiểm tra tính chung thực của người dùng, để đảm bảo tất cả người dùng đều cung cấp một tài khoản email đúng. Vì Link kích hoạt chỉ được gửi vào email có địa chỉ chính xác.
Ngoài cách này ra, còn có một số cách khác để xác nhận địa chỉ email của người dùng, nhưng có một vài hệ thống cũng sử dụng giống cách mà mình đang trình bày trong bài viết này.
Oauth
Mình muốn nói giải pháp thay thế là oauth bằng việc đăng nhập bằng tài khoản của bên thứ 3 với Social network login. Facebook, Twitter, Google+, và thậm trí Microsoft đều có hỗ trợ Oauth login (Open Authorization). Chắc bạn cũng đã nhìn thấy nút “Login with Facebook” rồi đúng không? chính là em nó.
StackOverflow là một trang cũng vậy, hãy xem cách mà trang này có thể đăng nhập được với nhiều tài khoản khác nhau.
Trong wordpress mình đã có bài cách tạo đăng nhập tài khoản sử dụng facebook, yahoo, google, bạn có thể xem tại đó. Bài này với cách đơn giản hơn.
Các bước tạo Email Activation
Các bước để thực hiện một đăng ký và mã kích hoạt tài khoản là:
- User điền form đăng ký và ấn nút register để tiến hành lưu thông tin trên database.
- Hệ thống sẽ sinh ra một chuỗi key duy nhất, mã này nhớ trong CSDL và đồng thời gửi cho user qua email mà họ cung cấp.
- User mở hòm thư, tìm thấy email đó và nhấn vào link chứa mã kích hoạt được gửi bởi hệ thống.
- Người dùng sẽ nhận được dòng thông báo thành công trên link. Ví dụ: tài khoản đã kích hoạt “Your account was actived”
Bắt đầu từ đâu?
Rất đơn giản thôi bạn, mình sẽ làm theo quy trình ở trên.
Bước 1 -3: tạo form đăng ký trong sign_up.php
Bước 4: lúc này người dùng đã nhận được email, nội dung trong email có thể sẽ như thế này.
Bước này là quan trọng đây, tạo file active.php. Công nghệ sử dụng trong bài này là php và mysql. Để gửi được email chúng ta có hàm PHP email hoặc nếu bạn xài share-host thì sử dụng thư viện SMTP PHPMailer và có thể gửi email bằng các tài khoản gmail, yahoo…Vì những share-host không cài riêng ứng dụng gửi nhận email, chỉ hỗ trợ trên VPS.
Chuẩn bị Mysql table, tạo với đoạn sql sau:
CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `nickname` VARCHAR(32) NOT NULL, `email` VARCHAR(264) NOT NULL, `verified` INT(11) NOT NULL COMMENT '0=no, 1=yes', `verification_code` VARCHAR(264) NOT NULL, `created` datetime NOT NULL, `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=134 ;
sign_up.php: chúng ta sẽ tạo form và code sử lý đăng ký tại đây.
<?php // if the sign up form was submitted if($_POST){ $email = isset($_POST['email']) ? $_POST['email'] : ""; // posted email must not be empty if(empty($email)){ echo "<div>Email cannot be empty.</div>"; } // must be a valid email address else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ echo "<div>Your email address is not valid.</div>"; } else{ //include database connection ... // check first if record exists $query = "SELECT id FROM users WHERE email = ? and verified = '1'"; $stmt = $con->prepare( $query ); $stmt->bindParam(1, $email); $stmt->execute(); $num = $stmt->rowCount(); if($num>0){ echo "<div>Your email is already activated.</div>"; } else{ // check first if there's unverified email related $query = "SELECT id FROM users WHERE email = ? and verified = '0'"; $stmt = $con->prepare( $query ); $stmt->bindParam(1, $email); $stmt->execute(); $num = $stmt->rowCount(); if($num>0){ // you have to create a resend verification script echo "<div>Your email is already in the system but not yet verified. <a href='resend.php'>Resend verification?</a>.</div>"; } else{ // now, compose the content of the verification email, it will be sent to the email provided during sign up // generate verification code, acts as the "key" $verificationCode = md5(uniqid("yourrandomstringyouwanttoaddhere", true)); // send the email verification $verificationLink = "http://example.com/activate.php?code=" . $verificationCode; $htmlStr = ""; $htmlStr .= "Hi " . $email . ",<br /><br />"; $htmlStr .= "Please click the button below to verify your subscription and have access to the download center.<br /><br /><br />"; $htmlStr .= "<a href='{$verificationLink}' target='_blank' style='padding:1em; font-weight:bold; background-color:blue; color:#fff;'>VERIFY EMAIL</a><br /><br /><br />"; $htmlStr .= "Kind regards,<br />"; $htmlStr .= "<a href='/' target='_blank'>Dịch vụ thiết kế web giá rẻ</a><br />"; $name = "Hoangweb.com"; $email_sender = "[email protected]"; $subject = "Verification Link | Thiết kế web giá rẻ | Subscription"; $recipient_email = $email; $headers = "MIME-Version: 1.0rn"; $headers .= "Content-type: text/html; charset=iso-8859-1rn"; $headers .= "From: {$name} <{$email_sender}> n"; $body = $htmlStr; // send email using the mail function, you can also use php mailer library if you want if( mail($recipient_email, $subject, $body, $headers) ){ // tell the user a verification email were sent echo "<div id='successMessage'>A verification email were sent to <b>" . $email . "</b>, please open your email inbox and click the given link so you can login.</div>"; // save the email in the database $created = date('Y-m-d H:i:s'); //write query, verified = '0' means it is unverified, on activation, it becomes '1' $query = "INSERT INTO users SET email = ?, verification_code = ?, created = ?, verified = '0'"; $stmt = $con->prepare($query); $stmt->bindParam(1, $email); $stmt->bindParam(2, $verificationCode); $stmt->bindParam(3, $created); // Execute the query if($stmt->execute()){ // echo "<div>Unverified email was saved to the database.</div>"; }else{ echo "<div>Unable to save your email to the database. <a href='/lien-he'>Contact Us.</a></div>"; //print_r($stmt->errorInfo()); } }else{ die("Sending failed."); } } } } } // show your sign up or registration form echo "<form action='" . $_SERVER[PHP_SELF] . "' method='post'>"; echo "<input type='email' name='email' placeholder='Enter your email address to subscribe' required />"; echo "<input type='submit' value='Subscribe' />"; echo "</form>"; ?>
Ở đoạn code trên, bạn dễ nhìn ra hàm md5 & uniqid
, nó được ứng dụng khá nhiều, trong các hệ thống bảo mật và ở đây mình dùng để tạo một chuỗi ngẫu nhiên và duy nhất cho những lần gọi tiếp theo.
Tiếp đến file activate.php – quyết định user có được kích hoạt hay không là ở file này. Vì mỗi một mã verification code, là khác nhau cho mỗi user. Do vậy thông tin này cũng là căn cứ xác định tài khoản user nào được kích hoạt.
<?php //database connection ... // check first if record exists $query = "SELECT id FROM users WHERE verification_code = ? and verified = '0'"; $stmt = $con->prepare( $query ); $stmt->bindParam(1, $_GET['code']); $stmt->execute(); $num = $stmt->rowCount(); if($num>0){ // update the 'verified' field, from 0 to 1 (unverified to verified) $query = "UPDATE users set verified = '1' where verification_code = :verification_code"; $stmt = $con->prepare($query); $stmt->bindParam(':verification_code', $_GET['code']); if($stmt->execute()){ // tell the user echo "<div>Your email is valid, thanks!. You may now login.</div>"; }else{ echo "<div>Unable to update verification code.</div>"; //print_r($stmt->errorInfo()); } }else{ // tell the user he should not be in this page echo "<div>I think you're in the wrong place.</div>"; } ?>
Đảm bảo người dùng đã mở email, và không cung cấp mã key sai. Lưu ý: mã key này không đoán được đâu nhé vì nó khó đoán hơn cả password.
Gửi mã kích hoạt vào điện thoại thông qua sms
Ngoài email ra bạn có thể sử dụng SMS làm phương tiện kích hoạt, bằng cách gửi mã bí mật ở trên vào sms của người dùng thay vì gửi email kèm theo link hướng dẫn kích hoạt. Để gửi sms từ website chúng ta phải dùng đến SMS API. Đến đây trong đầu bạn sẽ nẩy ra nhiều ý tưởng, có thể bạn nghĩ sẽ dùng dịch vụ nào đó cho phép gửi sms miễn phí như sms.vn hoặc sử dụng dịch vụ trả phí.
Tuy nhiên, trang web gửi sms đó phải hỗ trợ API. Mình thấy rất khó đối với những trang gửi free sms, vì nó bảo mật bằng captcha chống spam. Đòi hỏi bạn xành về sử lý dữ liệu web với CURL hơn để bắt hình captcha của nó giống như cách sử lý của phần mềm auto-poster vậy.
Nhưng có một cách khác không tốn kém mà các tin SMS gửi đi được kiểm xoát, ở đây mình không nói sử dụng trang web cung cấp dịch vụ SMS có phí nha. Bạn sử dụng chính chiếc smartphone của mình đang xài hàng ngày, và biến nó thành SMS gateway. Bạn hoàn toàn có thể gửi sms đi từ điện thoại của mình bằng nút lệnh trên website. Thay đoạn code gửi email kích hoạt ở trên bằng code gửi sms là xong.
Chúc bạn thành công!
Để nhận được bài viết mới vui lòng đăng ký kênh kiến thức WordPress từ A-Z ở Form bên dưới. Bạn cũng có thể nhận được sự trợ giúp trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
Tiểu ngọc says
Ad ơi, cho mình hỏi 1 xí.
Khi user đăng ký qua signup ở trang đăng ký thành viên mặc định của wordpress nó báo là kiểm tra tài khoản email. Thế nhưng nó ko gửi email về.
Vậy là bị làm sao hả bạn. Có phải mình chưa thiết lập gì đó ko
Hoàng Quách says
Bạn xem hướng dẫn cấu hình SMTP gửi email nhé
Solybe says
Anh hướng dẫn sử dụng sign_up.php như thế nào ạ. Em cám ơn
Nam Hoang says
Chào ad cho em hỏi. các code trên làm thế nào để show ra được form đăng nhập ạ. Em chưa hiểu lắm
// show your sign up or registration form
echo “”;
echo “”;
echo “”;
echo “”;
Và cách thiết lập ra sao.mong ad giúp!