使用 laravel 通过电子邮件验证注册

时间:2021-05-29 20:40:01

标签: laravel

大家好,今天我正在设计我的网站,任何新用户都必须在该网站上注册,我使用电子邮件向他们进行验证。 我在我的网站上使用 laravel 我想使用真实的电子邮件为新用户发送验证码 我不想要 mail-trap 服务 我想要真实的电子邮件。请告诉我完成这项工作需要什么。 请记住,当我的网站使用免费托管而非真实托管时,我想这样做。

1 个答案:

答案 0 :(得分:1)

您可以通过事件或在同一控制器中实现电子邮件。我的解决方案已经在 Laravel 5.6 上进行了测试。首先,在 .env 文件中对 gmail 进行电子邮件设置。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.googlemail.com
MAIL_PORT=465
MAIL_USERNAME=real email
MAIL_PASSWORD=real password
MAIL_ENCRYPTION=ssl

假设您希望用户在注册后必须激活他们的帐户。所以创建一个新模型:

php artisan make:modal VerifyUser –m

将此代码添加到创建的 migration

public function up()
{
    Schema::create('verify_users', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('user_id');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->string('token')->index();
        $table->timestamps();
    });
}

然后将 verified 字段添加到 users 表:

$table->boolean('verified')->default(false);

那么:

php artisan migrate

将此方法添加到User Model

class User extends Authenticatable
{    
    public function verifyUser()
    {
        return $this->hasOne('App\VerifyUser');
    }
}

将此方法添加到VerifyUser Model

class VerifyUser extends Model
{
    protected $guarded = [];

    public function user()
    {
        return $this->belongsTo('App\User', 'user_id');
    }
}

为继承自 Maiable 的电子邮件创建一个类。此文件是在电子邮件文件夹中创建的。

php artisan make:mail VerifyMail

VerifyMail class 应用以下更改:

namespace App\Mail;
...
class VerifyMail extends Mailable
{
    use Queueable, SerializesModels;
    public $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

    public function build()
    {
        return $this->view('emails.verifyUser');
    }
}

创建一个名为 emails 的文件夹,并在其中创建一个名为 verifyUser 的刀片文件。并将以下代码放入其中:

<body>
    <h2>Welcome to the site {{$user['name']}}</h2>
    <br/>
    Your registered email-id is {{$user['email']}} , Please click on the below link to verify your email account
    <br/>
    <a href="{{url('user/verify', $user->verifyUser->token)}}">Verify Email</a>
</body>

更改 create 中的 RegisterController 方法:

use App\Mail\VerifyMail;
use App\VerifyUser;
use Illuminate\Support\Facades\Mail;
use Illuminate\Http\Request;
...
protected function create(array $data)
    {
        $user = User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);

        $verifyUser = VerifyUser::create([
            'user_id' => $user->id,
            'token' => sha1(time())
        ]);
        \Mail::to($user->email)->send(new VerifyMail($user));

        return $user;
    }

使用这种方法,在用户注册后,会在用户表中添加一条记录,但当前验证的值为false或0。现在为了防止用户在注册后立即登录,在 RegisterController 中添加以下方法:

protected function registered(Request $request, $user)
{
    $this->guard()->logout();
    return redirect('/login')->with('status', 'We sent you an activation code. Check your email and click on the link to verify.');
}

未经验证的用户不应以任何方式登录。并且您必须覆盖 authenticated 方法才能成功登录用户。因此将 authenticated 方法添加到 LoginController 中:

public function authenticated(Request $request, $user)
{
    if (!$user->verified) {
        auth()->logout();
        return back()->with('warning', 'You need to confirm your account. We have sent you an activation code, please check your email.');
    }
    return redirect()->intended($this->redirectPath());
}

将此代码添加到 login.blade.php 以显示以上消息:

@if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
@endif
@if (session('warning'))
    <div class="alert alert-warning">
        {{ session('warning') }}
    </div>
@endif

接下来,为您发送到用户电子邮件的链接定义路由:

Route::get('/user/verify/{token}', 'Auth\RegisterController@verifyUser');

现在是激活用户的时候了。因此,验证值必须设置为 true 或 1。将以下方法添加到 RegisterController

public function verifyUser($token)
{
    $verifyUser = VerifyUser::where('token', $token)->first();
    if(isset($verifyUser) ){
        $user = $verifyUser->user;
        if(!$user->verified) {
            $verifyUser->user->verified = 1;
            $verifyUser->user->save();
            $status = "Your e-mail is verified. You can now login.";
        } else {
            $status = "Your e-mail is already verified. You can now login.";
        }
    } else {
        return redirect('/login')->with('warning', "Sorry your email cannot be identified.");
    }
    return redirect('/login')->with('status', $status);
}

完成。