一個好的登入系統,當然少不了忘記密碼的功能,這個功能通常是使用寄email功能做的。
例如我現在的專案使用的是一個簡單的流程
流程相當簡單,只要兩個function就可以搞定,一個是發送email的api,另一個是token驗證的api,驗證成功後將密碼更變為預設密碼。
laravel的寄送email功能有簡單也有複雜,目前我寄送的mail是很簡單的幾個字,所以我目前使用最簡單的方式寄信。
要寄信的話,理所當然會有用來寄信用的server,這當然有很多選擇例如mailgun之類的,我個人是使用Gmail寄信。
使用Gmail寄信的話,Google帳戶必須要設定兩步驟驗證機制。以及laravel的.env設定
有關的設定教學可以參考:https://shian420.pixnet.net/blog/post/344687356-%5Blaravel%5D-gmail-smtp-%E5%BE%9E%E8%A8%AD%E5%AE%9A%E5%88%B0%E7%99%BC%E4%BF%A1
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=25
MAIL_USERNAME=填入Gmail帳號
MAIL_PASSWORD=填入驗證碼
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=xxx.gmail.com
MAIL_FROM_NAME="${APP_NAME}"
use Illuminate\Support\Facades\Mail;
public function mail($email)
{
$user = Users::where('email', $email)->first();
if (!$user) {
return response()->json(['status' => false, 'error' => 'email false'], 400);
}
$userToken = $user->remember_token;
$url = "http://127.0.0.1:8003/api/password/change/$userToken";
$text = '點此修改密碼為 a00000000 ' . $url;
Mail::raw($text, function ($message) use ($email) {
$message->to($email)->subject('hiyaa');
});
return response()->json(['status' => true,], 200);
}
在發送mail的function,我將token放在mail內寄給使用者,使用者點擊mail內的連結,將會用Get method發送request,URL夾帶token,現在我必須驗證此token後,將密碼改成預設密碼。
public function change_password($userToken)
{
$user = Users::where('remember_token', $userToken)->first();
if (!$user) {
return response()->json(['status' => false, 'error' => 'token false'], 400);
}
$hash = password_hash('a00000000', PASSWORD_DEFAULT);
$user->update(['password' => $hash]);
return response()->json(['status' => true, 'message' => 'password had be changed'], 200);
}
這樣便完成一個簡單的忘記密碼功能了,不過這項功能現在還很簡陋,之後應該會再持續改進,應該也有其他的流程可以試試看,例如發送簡訊驗證碼之類的,之後若另有心得再來分享,今天就介紹到這邊,明天見。