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的密码为预设密码,回传成功

这样便完成一个简单的忘记密码功能了,不过这项功能现在还很简陋,之後应该会再持续改进,应该也有其他的流程可以试试看,例如发送简讯验证码之类的,之後若另有心得再来分享,今天就介绍到这边,明天见。


<<:  Modal in React ( Declarative Modal ) (2)

>>:  DAY26: 权限总结

在经营文化前,先了解现况

上一篇分享过「何谓团队文化」後,在讨论如何建立与经营团队文化前,我们先从了解目前的状况与定义你希望有...

[Day25]程序菜鸟自学C++资料结构演算法 – 快速排序法(Quick Sort)

前言:讲解完了基础的排序法後,接着要来讲解比较高等的排序法,今天和明天要介绍的都是始於分割资料的排序...

DAY 16 『 改用 xib 进行界面创作 』

storyboard 有三个概念是最容易混淆: xib:实际是个xml文件,xib = XML n...

Day16 Laravel - migrate

Docker及Laravel为以後每个专案都会用到的搭配,所以这种时候就将它做成一个类似模板的环境并...

D16 文件创建页 Create doc

先做了一个简易的文件创建页面 doc_info/views.py 设定成用get载入http://1...