IT/PHP

Laravel - 이메일 인증

Sungjun_ 2021. 5. 6. 19:22

Laravel Jetstream을 이용해 진행하겠습니다.

 

jetstream.laravel.com/2.x/installation.html

 

Installation | Laravel Jetstream

Installation Installing Jetstream You may use Composer to install Jetstream into your new Laravel project: After installing the Jetstream package, you may execute the jetstream:install Artisan command. This command accepts the name of the stack you prefer

jetstream.laravel.com

위 링크로 나와있는대로 설치를 진행하는데, livewire로 하겠습니다.

 

composer require laravel/jetstream

php artisan jetstream:install livewire

npm install
npm run dev
php artisan migrate

 

새 라라벨 프로젝트에 위 순서로 livewire 설치를 완료해주세요.

 

welcome

 

설치를 끝내고 register를 보겠습니다.

 

register

livewire 기본 회원가입 뷰입니다.

 

app\Actions\Fortify\CreateNewUser 파일을 여시면 아래와 같은 코드가 나옵니다.

 

<?php

namespace App\Actions\Fortify;

use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Laravel\Fortify\Contracts\CreatesNewUsers;
use Laravel\Jetstream\Jetstream;

class CreateNewUser implements CreatesNewUsers
{
    use PasswordValidationRules;

    /**
     * Validate and create a newly registered user.
     *
     * @param  array  $input
     * @return \App\Models\User
     */
    public function create(array $input)
    {
        Validator::make($input, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => $this->passwordRules(),
            'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['required', 'accepted'] : '',
        ])->validate();

        return User::create([
            'name' => $input['name'],
            'email' => $input['email'],
            'password' => Hash::make($input['password']),
        ]);
    }
}

 

 

일반적인 회원가입 코드와 같아서 넘어가겠습니다.

 

그 다음으로 User 모델로 가서 MustVerifiedEmail 인터페이스를 구현해줍시다.

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Fortify\TwoFactorAuthenticatable;
use Laravel\Jetstream\HasProfilePhoto;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable implements MustVerifyEmail
{
    use HasApiTokens;
    use HasFactory;
    use HasProfilePhoto;
    use Notifiable;
    use TwoFactorAuthenticatable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
        'two_factor_recovery_codes',
        'two_factor_secret',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
     * The accessors to append to the model's array form.
     *
     * @var array
     */
    protected $appends = [
        'profile_photo_url',
    ];
}

 

config/fortify.php 파일로 가서 주석 처리된 부분을 풀어줍니다.

'features' => [
        Features::registration(),
        Features::resetPasswords(),
        // Features::emailVerification(),
        Features::updateProfileInformation(),
        Features::updatePasswords(),
        Features::twoFactorAuthentication([
            'confirmPassword' => true,
        ]),
    ],

 

2021.05.04 - Laravel - 이메일 보내기

 

이전 글을 참고해서 .env 파일과 구글 계정 설정을 해줍니다.

 

이제 회원가입을 진행해줍니다.

 

인증 링크

 

그리고 수신함을 확인해보면 이렇게 인증 메일이 온 것을 확인할 수 있습니다.

 

버튼을 누르면 아래쪽에 보이는 링크로 연결이 되는데

/email/verify 뒤에 나오는 숫자는 user의 id이고, exipres는 인증 링크가 유효한 시간,

signature는 해쉬 값입니다.

 

이 부분은 illuminate\Auth\Notifications\VerifyEmail 파일에 있습니다.

 protected function verificationUrl($notifiable)
    {
        if (static::$createUrlCallback) {
            return call_user_func(static::$createUrlCallback, $notifiable);
        }

        return URL::temporarySignedRoute(
            'verification.verify',
            Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
            [
                'id' => $notifiable->getKey(),
                'hash' => sha1($notifiable->getEmailForVerification()),
            ]
        );
    }

 

이것으로 이메일 인증 마치겠습니다.