iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
1
Software Development

後端新手 使用laravel 從零開始 到開出api系列 第 26

Day26 laravel mail 登入系統 忘記密碼

Day26 laravel mail 登入系統 忘記密碼

一個好的登入系統,當然少不了忘記密碼的功能,這個功能通常是使用寄email功能做的。
例如我現在的專案使用的是一個簡單的流程

  1. 請使用者輸入自己的email
  2. 後端再寄信給該使用者。
  3. email內容是一個連結,帶有token,點擊會將密碼重置為預設密碼。
  4. 請使用者將使用預設密碼登入自行修改密碼。

流程相當簡單,只要兩個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

.env設定

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}"

mail 寄送 function

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);
    }
  • 3~4
    使用email尋找user資料,若找不到就回傳錯誤400
  • 7
    取出user遭料中的userToken
  • 8~9
    設定傳送的內容,內容為url連結加上userToken
  • 10~12
    使用Mail類別寄送郵件,使用raw方法寄送。在Mail類別,send方法可以寄送一個view模版,而若是你想只寄一些簡單的訊息,可以使用raw寄送純文字
  • 13
    回傳成功

驗證function

在發送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);
    }
  • 1~6
    使用token找到該user的資料,若找不到則回傳錯誤400
  • 7
    將預設密碼使用hash加密
  • 8~9
    修改該user的密碼為預設密碼,回傳成功

這樣便完成一個簡單的忘記密碼功能了,不過這項功能現在還很簡陋,之後應該會再持續改進,應該也有其他的流程可以試試看,例如發送簡訊驗證碼之類的,之後若另有心得再來分享,今天就介紹到這邊,明天見。


上一篇
Day25 設計使用者關聯的CRUD
下一篇
Day27 laravel todolist 建立使用者群組
系列文
後端新手 使用laravel 從零開始 到開出api30

尚未有邦友留言

立即登入留言