박주니 개발 정리

이메일 인증에 따른 상태 전환 본문

라라벨

이메일 인증에 따른 상태 전환

박주니 2022. 3. 23. 11:14
728x90
반응형

1. User DB에 status을 column을 추가합니다. 저는 상태에 숫자를 넣을 것이기 때문에 integer('status')로 했습니다.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->string('role');
            $table->integer('status');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

2. 회원가입시 status가 자동적으로 2가 추가될 수 있게 설정합니다.

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class RegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\Models\User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'role' => 'user',
            'status' => '2'
        ]);
    }
}
  • 참고▶ status가 2일 경우에는 이메일 검증이 안됬다는 의미이고 이제 할 작업은 이메일 받은 페이지에 버튼을 눌렀을 때 status가 1로 전환할려고 합니다.

3. emails\TestMail 에서 인증을 눌렀을 때 인증 관리 페이지로 넘어갈 수 있는 기능을 넣습니다.

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                @csrf
                <h1>{{ $details['email'] }}</h1>
                <h1>{{ $details['title'] }}</h1>
                <p>{{ $details['body'] }}</p>
                <a href='http:/homestead.test/confirmAuth/{{ $details["id"] }}'>인증</a>
            </div>
        </div>
    </div>
</div>
@endsection

참고▶

  • <a href='http:/homestead.test/confirmAuth/{{ $details["id"] }}'>인증</a>로 한 이유는 먼저 보낸 페이지가 현 작업하는 페이지가 아니기 때문에 예를 들어서 /confirmAuth로 했을 때 네이버로 이메일을 받았다면 naver.com/confirmAuth 루트로 이동하는 것을 볼 수 있습니다. 
  • {{ $details["id"] }} 는 해당 유저의 아이디를 찾아서 status를 전환해줄 것이기 때문에 queryString을 인증 관리 페이지로 넘기기 위함입니다. 

4. web.php에서 MailController moveConfirm class를 통해 인증 관리 페이지로 넘어갈 수 있게 설정합니다.

Route::get('/confirmAuth/{id}', [App\Http\Controllers\MailController::class, 'moveConfirm']);
  • 참고▶ 인증 관리 페이지이기 때문에 UserController에서 진행하고 싶었으나 현재 UserController은 처음에 라라벨 프로젝트를 만들때부터 로그인창으로 바로 넘어가게 되어있어서 중간에 미들웨어를 거치지 않은 MailController로 설정했습니다.

5. MailController에서 moveConfirm class를 통해서 인증 관리 페이지 뷰로 넘어갈 수 있게 설정합니다. 그리고 데이터는 현재 상태 확인을 보여주기 위해 해당 메일 계정의 유저 데이터를 compact()로 보내줍니다.

    public function moveConfirm($id){
        $user = User::find($id);
        return view('confirm', compact('user'));
    }

6. confirm 프론트에서 인증 버튼을 누르면 업데이트 및 프론트에 조건에 따라 status가 1일 경우에는 인증, 2일 경우에는 인증 확인 필요가 보여질 수 있게 만듭니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

    <form action='/confirmAuth/{{ $user->email }}' method="POST">
        @method('PUT')
        @csrf
        confirm
        {{ $user->email }}
        <button type="submit">인증</button>
        @if ($user->status == 1)
            <h2>인증 완료</h2>
            @elseif ($user->status == 2)
            <h2>인증 확인 필요</h2>
        @endif
    </form>
</body>
</html>
  • 참고▶ update 설명은 라라벨 crud에 자세하게 설명했습니다. 혹시나 이부분이 이해가 안된다면 crud 설명한 부분을 참고해주시길 바랍니다. 

7. web.php에서 인증 버튼을 눌렀을 때 MailController statusUpdate class로 이동해서 update가 진행될 수 있게 설정합니다.

Route::put('/confirmAuth/{email}', [App\Http\Controllers\MailController::class, 'statusUpdate']);

8. 해당 유저를 queryString email로 넘긴 것으로 찾아서 status가 2로 되어있는 것을 1로 설정하고 저장합니다. 그리고 인증이 되었으니 바로 로그인 화면으로 갈 수 있게 셋팅합니다.

    public function statusUpdate($email){
        $user = User::where('email', $email)->first();
        $user->status = '1';
        $user->save();
        return redirect('login');
    }

sql 확인

 

728x90
반응형
Comments