ایده پردازان جوان

مرجع بروزترین آموزش ها در زمینه مهندسی کامپیوتر

پیشنهاد شگفت انگیز سایت

خرید آموزش ساخت اپلیکیشن درخواست تاکسی مشابه اسنپ با 60 درصد تخفیف

خرید پکیج ویژه ساخت فروشگاه اینترنتی مشابه دیجی کالا به همراه نسخه اندروید با لاراول با 70 درصد تخفیف

آموزش تایید ایمیل در لاراول (بخش دوم)

در پست قبلی نحوه ارسال لینک جهت تایید ایمیل کاربر آموزش داده شد و در این بخش میخواهیم به سفارسی سازی قابلیت Email Verification در لاراول بپردازیم

برای انجام تغییرات میتوانیم از فایل VerificationController شروع کنیم

در این کلاس از تریت VerifiesEmails استفاده شده که شامل سه متد ( show - verify - resend ) میباشد که با کاربرد هر کدام آشنا خواهیم شد

و در قسمت construct__ میدلور هایی (middleware) برای این سه متد تعریف شده

استفاده از میدلور auth باعث میشود که فقط افرادی که لاگین کرده باشن بتوانند به این سه متد دسترسی داشته باشن که در پست قبلی نیز گفته شده که برای تایید ایمیل لازم هست که اول کاربر لاگین کند

در متد های ( verify - resend ) از میدلور throttle استفاده شده تا هر شخص بتوانند در یک دقیقه فقط شش بار این متد ها را اجرا نمایید با توجه به اینکه در متد resend ارسال ایمیل به کاربر انجام میشود برای جلوگیری از درخواست ارسال مداوم ، لازم هست از کد کپچا و یا از میدلور throttle استفاده شود

میدلور signed برای بررسی صحیح بودن لینکی هست که  برای تایید ایمیل کاربر ارسال شده و در صورتی که لینک صحیح نباشد(مدت اعتبار لینک به اتمام رسیده باشد یا پارامتر های لینک اشتباه باشد) متد verify اجرا نخواهد شد پیغام Invalid signature (نامعتبر بودن امضا) را نمایش میدهد

برای دسترسی به ترید VerifiesEmails میتوانید با گرفتن دکمه Ctrl روی آن کلیک کنید

<?php

namespace Illuminate\Foundation\Auth;

use Illuminate\Http\Request;
use Illuminate\Auth\Events\Verified;
use Illuminate\Auth\Access\AuthorizationException;

trait VerifiesEmails
{
    use RedirectsUsers;

    /**
     * Show the email verification notice.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function show(Request $request)
    {
        return $request->user()->hasVerifiedEmail()
                        ? redirect($this->redirectPath())
                        : view('auth.verify');
    }

    /**
     * Mark the authenticated user's email address as verified.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     * @throws \Illuminate\Auth\Access\AuthorizationException
     */
    public function verify(Request $request)
    {
        if ($request->route('id') != $request->user()->getKey()) {
            throw new AuthorizationException;
        }

        if ($request->user()->hasVerifiedEmail()) {
            return redirect($this->redirectPath());
        }

        if ($request->user()->markEmailAsVerified()) {
            event(new Verified($request->user()));
        }

        return redirect($this->redirectPath())->with('verified', true);
    }

    /**
     * Resend the email verification notification.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function resend(Request $request)
    {
        if ($request->user()->hasVerifiedEmail()) {
            return redirect($this->redirectPath());
        }

        $request->user()->sendEmailVerificationNotification();

        return back()->with('resent', true);
    }
}

با فراخوانی روت email/verify متد show اجرا خواهد شد
با توجه به اینکه این مسیر بعد از تایید ایمیل نیز قابل دسترسی هست برای همین در متد  show ابتدا توسط متد hasVerifiedEmail بررسی میشود که ایمیل کاربر قبلا تایید شده یا نه و در صورت تایید کاربر به یک مسیر مشخص redirect میشود که این مسیر نیز به سادگی قابل تغییر میباشد و در صورت عدم تایید ویو verify که در پوشه auth موجود هست نمایش داده میشود

توجه داشته باشین که ملاک بررسی تایید شدن ایمیل فیلد email_verified_at جدول users هست که در صورتی که برابر با مقدار null باشد یعنی ایمیل تایید نشده

در صورت نیاز به این صورت نیز میتوانید متوجه شوید که کاربر ایمیل خود را تایید کرده یا نه

if(Auth::user()->hasVerifiedEmail())
{
    //verified
}
else
{

}

توسط متد resend ارسال ایمیل حاوی امضا(لینک جهت تایید ایمیل) انجام میشود در این متد نیز اول بررسی میشود که ایمیل کاربر قبلا تایید شده یا نه و بعد در صورت عدم تایید توسط متد sendEmailVerificationNotification ارسال ایمیل انجام میشود و در نهایت کاربر مجددا به مسیر email/verify منتقل میشود و یک سشن یک بار مصرف با نام resent ساخته میشود تا در صورت وجود این سشن به کاربر اطلاع داده شود که لینک جهت تایید ایمیل ارسال شده (این سشن در فایل verify.blade.php مورد استفاده قرار میگیرد)

متد verify بعد از بررسی صحیح بودن امضا (لینک تولید شده برای تایید ایمیل) اجرا میشود

در این متد نیز اول برابر بودن شناسه کاربری موجود در لینک تولید شده و شناسه کاربری که در سایت لاگین شده مورد بررسی قرار میگیرد و بعد از بررسی اینکه قبلا ایمیل تایید شده یا نه متد markEmailAsVerified اجرا میشود که با اجرای این متد فیلد email_verified_at موجود در جدول  users اپدیت شده و زمان تایید ایمیل ثبت میشود و در نهایت redirect کاربر همراه با تولید session یک بار مصرف با نام verified انجام میشود که با تولید شدن این session میتوانید به کاربر اطلاع دهید که تایید ایمیل انجام شده

بررسی فایل verify.blade.php

{{--resources/views/auth/verify.blade.php--}}
@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Verify Your Email Address') }}</div>

                <div class="card-body">
                    @if (session('resent'))
                        <div class="alert alert-success" role="alert">
                            {{ __('A fresh verification link has been sent to your email address.') }}
                        </div>
                    @endif

                    {{ __('Before proceeding, please check your email for a verification link.') }}
                    {{ __('If you did not receive the email') }},
                        <a href="{{ route('verification.resend') }}">
                            {{ __('click here to request another') }}
                        </a>.
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

همان طور که قبلا توضیح داده شده از این فایل برای درخواست تایید ایمیل کاربر استفاده میشود و وجود سشن resent نشان دهنده ارسال لینک جهت تایید ایمیل کاربر هست و با هر بار کلیک بر روی click here to request another روت verification.resend جهت ارسال ایمیل حاوی لینک اجرا میشود

برای تغییر در ایمیل ارسال شده به کاربر میتوانیم  نوتیفیکیشن VerifyEmail را تغییر دهیم

برای این منظور با نوشتن اسم کلاس (VerifyEmail) در ادیتور میتوانیم کلاس مورد نظر را پیدا کنیم

<?php

namespace Illuminate\Auth\Notifications;

use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\Lang;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;

class VerifyEmail extends Notification
{
    /**
     * The callback that should be used to build the mail message.
     *
     * @var \Closure|null
     */
    public static $toMailCallback;

    /**
     * Get the notification's channels.
     *
     * @param  mixed  $notifiable
     * @return array|string
     */
    public function via($notifiable)
    {
        return ['mail'];
    }

    /**
     * Build the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {
        if (static::$toMailCallback) {
            return call_user_func(static::$toMailCallback, $notifiable);
        }

        return (new MailMessage)
            ->subject(Lang::getFromJson('Verify Email Address'))
            ->line(Lang::getFromJson('Please click the button below to verify your email address.'))
            ->action(
                Lang::getFromJson('Verify Email Address'),
                $this->verificationUrl($notifiable)
            )
            ->line(Lang::getFromJson('If you did not create an account, no further action is required.'));
    }

    /**
     * Get the verification URL for the given notifiable.
     *
     * @param  mixed  $notifiable
     * @return string
     */
    protected function verificationUrl($notifiable)
    {
        return URL::temporarySignedRoute(
            'verification.verify', Carbon::now()->addMinutes(60), ['id' => $notifiable->getKey()]
        );
    }

    /**
     * Set a callback that should be used when building the notification mail message.
     *
     * @param  \Closure  $callback
     * @return void
     */
    public static function toMailUsing($callback)
    {
        static::$toMailCallback = $callback;
    }
}

از طریق متد verificationUrl امضا برای تایید ایمیل کاربر تولید میشود(لینک ارسال شده در ایمیل) و مدت زمان اعتبار این لینک نیز 60 دقیقه انتخاب شده که در صورت نیاز میتوانید آن را تغییر دهید

و از طریق متد toMail محتوای ایمیل ارسال شده تعیین میشود.در صورتی که سایت شما چند زبانه نمیباشد میتوانید مستقیما عبارت های لازم را اضافه کنید مشابه کد های زیر

 return (new MailMessage)
            ->greeting('سلام')
            ->subject('تایید آدرس ایمیل')
            ->line('لطفا برای تأیید آدرس ایمیل خود، روی دکمه زیر کلیک کنید.')
            ->action(
                'تایید آدرس ایمیل',
                $this->verificationUrl($notifiable)
            )
            ->salutation("با احترام ایده پردازان جوان")
            ->line('اگر یک حساب کاربری ایجاد نکردید، هیچ اقدام دیگری لازم نیست');

توجه داشته باشید که هیچ اجباری به استفاده از این کدها نیست و مهم فقط امضای تولید شده میباشد که باید به ایمیل کاربر ارسال شود و میتوانید ایمیل با ظاهرا دلخواه را به همراه امضای تولید شده ایجاد و ارسال نمایید

خب به پایان این آموزش رسیدم امیداورم که این آموزش برای شما مفیده واقع شده باشد در صورتی که سوالی در مورد این آموزش دارید میتوانید در قسمت نظرات مطرح کنید

 

در حال دریافت اطلاعات