生活随笔
收集整理的這篇文章主要介紹了
账号通过邮箱找回密码功能设计
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
通常所說的密碼找回功能不是真的能把忘記的密碼找回,因?yàn)槲覀兊拿艽a是加密保存的,一般開發(fā)者會在驗(yàn)證用戶信息后通過程序生成一個新密碼或者生成一個特定的鏈接并發(fā)送郵件到用戶郵箱,用戶從郵箱鏈接到網(wǎng)站的重置密碼模塊重新設(shè)置新密碼。
當(dāng)然現(xiàn)在有的網(wǎng)站也有手機(jī)短信的方式找回密碼,原理就是通過發(fā)送驗(yàn)證碼來驗(yàn)明正身,和發(fā)送郵件驗(yàn)證一樣,最終還是要通過重置密碼來完成找回密碼的流程。
密碼找回的功能,一般步驟是:
1.表單輸入注冊時的郵箱;
2.驗(yàn)證用戶郵箱是否正確,如果用戶郵箱不存在網(wǎng)站的用戶表中,則提示用戶郵箱未注冊;
3.發(fā)送郵件,如果用戶郵箱確實(shí)存在用戶表中,則組合用于驗(yàn)證用戶信息的字符串,并構(gòu)造
URL發(fā)送到用戶郵箱中;
4.用戶登錄郵箱收取郵件,點(diǎn)擊
URL鏈接到網(wǎng)站驗(yàn)證程序;
5.網(wǎng)站程序通過用戶請求的字符串查詢本地用戶表,比對用戶信息是否正確;
6.如果正確則轉(zhuǎn)到重置密碼頁面重新設(shè)置新密碼,反之則提示用戶驗(yàn)證無效。
HTML
我們在找回密碼的頁面上放置一個要求用戶輸入注冊時所用的郵箱,然后提交前臺js來處理交互。
<p><strong>輸入您注冊的電子郵箱,找回密碼:
</strong></p>
<p><input type="text" class="input" name="email" id="email"><span id="chkmsg"></span></p>
<p><input type="button" class="btn" id="sub_btn" value="提 交"></p>
jQuery
當(dāng)用戶輸入完郵箱并點(diǎn)擊提交后,jQuery先驗(yàn)證郵箱格式是否正確,如果正確則通過向后臺sendmail.php發(fā)送Ajax請求,sendmail.php負(fù)責(zé)驗(yàn)證郵箱是否存在和發(fā)送郵件,并會返回相應(yīng)的處理結(jié)果給前臺頁面,請看jQuery代碼:
$(
function(){ $(
"#sub_btn").click(
function(){ var email = $(
"#email").val();
var preg =
/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
if(email==
'' || !preg.test(email)){ $(
"#chkmsg").html(
"請?zhí)顚懻_的郵箱!"); }
else{ $(
"#sub_btn").attr(
"disabled",
"disabled").val(
'提交中..').css(
"cursor",
"default"); $.post(
"sendmail.php",{mail:email},
function(msg){ if(msg==
"noreg"){ $(
"#chkmsg").html(
"該郵箱尚未注冊!"); $(
"#sub_btn").removeAttr(
"disabled").val(
'提 交').css(
"cursor",
"pointer"); }
else{ $(
".demo").html(
"<h3>"+msg+
"</h3>"); } }); } });
})
以上使用的jQuery代碼很方便簡潔的完成了前端交互操作,如果您有一定的jQuery基礎(chǔ),那上面的代碼一目了然,不多解釋。
PHP
sendmail.php需要驗(yàn)證Email是否存在系統(tǒng)用戶表中,如果有,則讀取用戶信息,將用戶id、用戶名和密碼驚醒md5加密生成一個特別的字符串作為找回密碼的驗(yàn)證碼,然后構(gòu)造URL。同時我們?yōu)榱丝刂芔RL鏈接的時效性,將記錄用戶提交找回密碼動作的操作時間,最后調(diào)用郵件發(fā)送類發(fā)送郵件到用戶郵箱,發(fā)送郵件類smtp.class.php已經(jīng)打包好,請下載。
include_once(
"connect.php");
$email = stripslashes(trim(
$_POST[
'mail']));
$sql =
"select id,username,password from `t_user` where `email`='$email'";
$query = mysql_query(
$sql);
$num = mysql_num_rows(
$query);
if(
$num==
0){
echo 'noreg';
exit;
}
else{
$row = mysql_fetch_array(
$query);
$getpasstime = time();
$uid =
$row[
'id'];
$token = md5(
$uid.
$row[
'username'].
$row[
'password']);
$url =
"http://www.helloweba.com/demo/resetpass/reset.php?email=".
$email.
"
&token=".
$token;
$time = date(
'Y-m-d H:i');
$result = sendmail(
$time,
$email,
$url);
if(
$result==
1){
$msg =
'系統(tǒng)已向您的郵箱發(fā)送了一封郵件<br/>請登錄到您的郵箱及時重置您的密碼!'; mysql_query(
"update `t_user` set `getpasstime`='$getpasstime' where id='$uid '"); }
else{
$msg =
$result; }
echo $msg;
}
function sendmail($time,$email,$url){ include_once(
"smtp.class.php");
$smtpserver =
"";
$smtpserverport =
25;
$smtpusermail =
"";
$smtpuser =
"";
$smtppass =
"";
$smtp =
new Smtp(
$smtpserver,
$smtpserverport,
true,
$smtpuser,
$smtppass);
$emailtype =
"HTML";
$smtpemailto =
$email;
$smtpemailfrom =
$smtpusermail;
$emailsubject =
"Helloweba.com - 找回密碼";
$emailbody =
"親愛的".
$email.
":<br/>您在".
$time.
"提交了找回密碼請求。請點(diǎn)擊下面的鏈接重置密碼
(按鈕24小時內(nèi)有效)。<br/><a href='".
$url.
"'target='_blank'>".
$url.
"</a>";
$rs =
$smtp->sendmail(
$smtpemailto,
$smtpemailfrom,
$emailsubject,
$emailbody,
$emailtype);
return $rs;
}
好了,這個時候你的郵箱將會收到一封來自helloweba的密碼找回郵件,郵件內(nèi)容中有一個URL鏈接,點(diǎn)擊該鏈接到helloweba.com的reset.php來驗(yàn)證郵箱。
include_once(
"connect.php");
$token = stripslashes(trim(
$_GET[
'token']));
$email = stripslashes(trim(
$_GET[
'email']));
$sql =
"select * from `t_user` where email='$email'";
$query = mysql_query(
$sql);
$row = mysql_fetch_array(
$query);
if(
$row){
$mt = md5(
$row[
'id'].
$row[
'username'].
$row[
'password']);
if(
$mt==
$token){
if(time()-
$row[
'getpasstime']>
24*
60*
60){
$msg =
'該鏈接已過期!'; }
else{
$msg =
'請重新設(shè)置密碼,顯示重置密碼表單,<br/>這里只是演示,略過。'; } }
else{
$msg =
'無效的鏈接'; }
}
else{
$msg =
'錯誤的鏈接!';
}
echo $msg;
reset.php首先接受參數(shù)email和token,然后根據(jù)email查詢數(shù)據(jù)表t_user中是否存在該Email,如果存在則獲取該用戶的信息,并且和sendmail.php中的token組合方式一樣構(gòu)建token值,然后與url傳過來的token進(jìn)行對比,如果當(dāng)前時間與發(fā)送郵件時的時間相差超過24小時的,則提示“該鏈接已過期!”,反之,則說明鏈接有效,并且調(diào)轉(zhuǎn)到重置密碼頁面,最后就是用戶自己設(shè)置新密碼了。
總結(jié)
以上是生活随笔為你收集整理的账号通过邮箱找回密码功能设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。