Membuat Login, Register, Forgot Password API dengan Lumen

Hallo saya Jamal

Fitur yang wajib ada dalam setiap aplikasi adalah fitur manajemen data user, mulai dari registrasi user, login user sampai forgot password user.

Pada pembahasa artikel ini saya mengunakan lumen ( https://lumen.laravel.com/ ).

Lumen adalah Micro Framework yang diciptakan pengembang Laravel untuk mengakomodasi kebutuhan developer yang ingin membuat aplikasi dalam skala lebih kecil dari Laravel. Karena banyak library yang dihilangkan dalam bundle source code, Lumen bisa dijadikan framework untuk membuat REST API.

Instalasi

untuk menginstall lumen ke komputer local kita, bisa melaui terminal/cmd kemudian ketikan perintah berikut:

composer create-project --prefer-dist laravel/lumen lumen_rest_api

Seting Koneksi Database

Setelah berhasil melakukan instalasi kita bisa buka folder project melalui code editor, disini penulis menggunakan Visual Studio Code ( https://code.visualstudio.com/) .

buka file .env di folder project kita, kemudian setting koneksi databasenya seperti berikut.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=NAMA_DATABASE_ANDA
DB_USERNAME=USERNAME_DATABASE_ANDA
DB_PASSWORD=PASSWORD_DATABASE_ANDA

Menjalankan Server

Setelah konfigurasi database selesai, kemudian jalankan server dengan perintah berikut:

php -S localhost:8000 -t public

untuk testing kita bisa buka browser kemudian ketik localhost:8000, nanti akan muncul tampilan seperti berikut

Application Key

Jika aplikasi anda mengalami error seperti ini

Maka anda bisa mengupdate file .env ada baris kode APP_KEY

APP_KEY=APLIKASI_KEY_ANDA

APP_KEY ini bisa anda isi sendiri dengan string random 32 karakter, atau anda bisa generate dengan kode dibawah

$router->get('/key', function() {
    return \Illuminate\Support\Str::random(32);
});

Database Migration

Pada laravel/lumen kita bisa menggunakan fitur migration untuk generate tabel ke database yang telah kita seting sebelumnya.

untuk membuat tabel dengan menggunakan migration, kita bisa masuk ke terminal/cmd folder project kita, kemudian ketik perintah berikut:

php artisan make:migration NAMA_MIGRATION_YANG_ANDA_BUAT

Sebagai contoh kita akan membuat sebuah migration untuk tabel user, dengan perintah:

php artisan make:migration create_tabel_user

Schema Database

Setelah kita berhasil melakukan create migration seperti pada perintah diatas, sekarang kita buka file tersebut di folder Database > Migration.

kemudian kita isi file migration yang telah kita buat menjadi seperti berikut

<?php

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

class CreateTabelUser extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('first_name');
            $table->string('last_name');
            $table->string('email')->unique();
            $table->string('username',20)->unique();
            $table->string('password');
            $table->enum('active',['Y','N'])->default('N');
            $table->timestamp('email_verified_at')->nullable();
            $table->string('token',191)->nullable();
            $table->rememberToken();
            $table->timestamps();
            $table->softDeletes();
        });
    }

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

Jalankan Migration

langkah selanjutnya adalah menjalankan file migration kita, supaya schema yang telah kita buat diatas bisa digenerate menjadi tabel ke database.

jalankan perintah berikut

php artisan migrate

Bootstrap/app.php

Perlu diperhatikan bahwa pada Lumen beberapa fitur seperti Eloquent harus diaktifkan secara manual, untuk mengaktifkan eloquent di lumen kita bisa buka file pada folder bootstrap > app.php, kemudian uncomment beberapa baris kode berikut

//uncomment baris berikut
$app->withFacades();
$app->withEloquent();
//tambahkan baris berikut
$app->configure('auth');
//uncomment baris berikut
$app->routeMiddleware([
'auth' => App\Http\Middleware\Authenticate::class,
]);
//uncomment baris berikut
$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);
$app->register(App\Providers\EventServiceProvider::class);

Register

Baiklah kita sudah selesai untuk melakukan konfigurasi awal dari setting database dan membuat migration, selanjutnya kita mulai membuat sebuah route, untuk dokumentasi route anda bisa cek disini https://lumen.laravel.com/docs/8.x/routing

route register ini kita buat untuk menyimpan data registrasi user, untuk membuat route register ini, kita bisa mulai buka file web.php, pada folder routes, kemudian masukkan perintah berikut:

$router->post('registrasi','WebController@save_registrasi');

Setelah itu buatlah sebuah controller dengan nama WebController.php (nama controller ini bisa bebas, sesuai dengan selera anda) pada folder App/Http/Controllers lalu buatlah fungsi dengan nama save_registrasi seperti pada contoh berikut:

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use App\Models\User;

class WebController extends Controller
{

    public function save_registrasi(Request $request)
    {
        $this->validate($request, [
            'first_name'=>'required',
            'last_name'=>'required',
            'email'=>'required',
            'username'=>'required',
            'password'=>'required|confirmed',
            'password_confirmation'=>'required',
        ]);

        $model = new User;
        $model->first_name = $request->input('first_name');
        $model->last_name = $request->input('last_name');
        $model->username = $request->input('username');
        $model->email = $request->input('email');
        $model->password = Hash::make($request->input('password'));
        $model->token = Str::random(40) . $request->input('email');
        $model->active = 'N';

        $save = $model->save();

        if($save)
        {
            $data = array( 
                'success'=>true,
                'message'=>'Registration successfull' 
            );
        }else{
            $data = array( 
                'success'=>false,
                'message'=>'Registration failed'
            );
        }

        return $data;
    }
}

Kemudian kita coba hasilnya melalui postman, pastikan server anda sudah jalan terlebih dahulu, jika belum anda bisa menjalankan server dengan perintah berikut:

php -S localhost:8000 -t public

jika muncul tampilan seperti diatas berarti kita sudah berhasil untuk membuat api registrasi user.

Send Email Registrasi

Pada function save_registrasi diatas kita telah set $model->active = ’N’ yang artinya user tersebut belum aktif.

selanjutnya kita akan mengirim sebuah email ke user yang telah melakukan registrasi, nanti nya di dalam email ini terdapat sebuah link untuk aktivasi data user tersebut.

buatlah sebuah folder Mail di dalam folder app project kita, kemudian didalam folder Mail tersebut buat sebuah file baru dengan nama RegistrasiEmail.php, dan tambahkan kode seperti berikut

<?php
namespace App\Mail;
 
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
 
class RegistrasiEmail extends Mailable{
 
    use Queueable, SerializesModels;
    
    public $full_name;
    public $link_activation;

    public function __construct($full_name, $link_activation)
    {
        $this->full_name = $full_name;
        $this->link_activation = $link_activation;
    }
 
    //build the message.
    public function build() {
        return $this->from(env('MAIL_FROM_ADDRESS'),env('MAIL_FROM_NAME'))
                ->subject('Registration')
                ->view('emails.registrasi');
    }
}

Create email registrasi view

kemudian kita buat sebuah view untuk email registrasi tersebut, buatlah sebuah folder emails didalam folder resources/views, lalu buat file di dalam folder emails dengan nama registrasi.blade.php, lalu isi dengan kode seperti berikut

<p>Hi, <strong>{{$full_name}}</strong></p>

<p>
You account has been created.
</p>

<p>
Please visit this url to activate your account.
</p>

<p>
    <a href="{{$link_activation}}">{{$link_activation}}</a>
</p>

<p>
    Sincerely,
</p>

<p>
    Admin
</p>

<br>
<p>
This message was generated automatically. Please do not reply to this message.
</p>

lalu kita edit function save_registrasi pada file WebController.php, kita akan menambahkan sebuah code untuk mengirim email setelah user berhasil melakukan registrasi.

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use App\Models\User;

use Illuminate\Support\Facades\Mail;
use App\Mail\RegistrasiEmail;

class WebController extends Controller
{

    public function save_registrasi(Request $request)
    {
        $this->validate($request, [
            'first_name'=>'required',
            'last_name'=>'required',
            'email'=>'required',
            'username'=>'required',
            'password'=>'required|confirmed',
            'password_confirmation'=>'required',
        ]);

        $model = new User;
        $model->first_name = $request->input('first_name');
        $model->last_name = $request->input('last_name');
        $model->username = $request->input('username');
        $model->email = $request->input('email');
        $model->password = Hash::make($request->input('password'));
        $model->token = Str::random(40) . $request->input('email');
        $model->active = 'N';

        $save = $model->save();

        if($save)
        {
            $receiver = $model->email;
            $full_name = $model->first_name.' '.$model->last_name;
            $link_activation = env('FE_URL').'/activation/'.$model->token;

            Mail::to($receiver)->send(new RegistrasiEmail($full_name, $link_activation));
            
            $data = array( 
                'success'=>true,
                'message'=>'Registration successfull' 
            );
        }else{
            $data = array( 
                'success'=>false,
                'message'=>'Registration failed'
            );
        }

        return $data;
    }
}

pada tahap ini kita belum berhasil untuk mengirim email, kita perlu mensetting konfigurasi email kita di file .env, pada contoh ini penulis menggunakan https://mailtrap.io/ untuk mengetes email ini,

kita tambahkan file .env kita menjadi seperti berikut

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=USER_NAME_MAILTRAP
MAIL_PASSWORD=PASSWORD_USER_MAILTRAP
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="admin@website.com"
MAIL_FROM_NAME="Administrator"
FE_URL = "http://localhost:8000" //atau bisa diganti dengan url frontend anda

kemudian kita juga perlu menginstall vendor mail pada lumen, ketik kode berikut pada terminal/cmd

composer require illuminate/mail

edit beberapa baris di bootstrap > app.php menjadi seperti berikut

//update withFacades menjadi seperti berikut
$app->withFacades(true, [
'Illuminate\Support\Facades\Mail' => 'Mail',
]);
//tambahkan baris berikut
$app->configure('mail');
$app->alias('mail.manager', Illuminate\Mail\MailManager::class);
$app->alias('mail.manager', Illuminate\Contracts\Mail\Factory::class);
$app->alias('mailer', Illuminate\Mail\Mailer::class);
$app->alias('mailer', Illuminate\Contracts\Mail\Mailer::class);
$app->alias('mailer', Illuminate\Contracts\Mail\MailQueue::class);
//tambahkan baris berikut
$app->register(Illuminate\Mail\MailServiceProvider::class);

Setelah itu buat config untuk driver mail ini, buat sebuah folder pada project anda dengan nama config, kemudian dalam folder config buatlah sebuah file dengan nama mail.php

<?php
return [
    /*
    |--------------------------------------------------------------------------
    | Mail Driver
    |--------------------------------------------------------------------------
    |
    | Laravel supports both SMTP and PHP's "mail" function as drivers for the
    | sending of e-mail. You may specify which one you're using throughout
    | your application here. By default, Laravel is setup for SMTP mail.
    |
    | Supported: "smtp", "sendmail", "mailgun", "mandrill", "ses",
    |            "sparkpost", "postmark", "log", "array"
    |
    */
    'driver' => env('MAIL_DRIVER', 'smtp'),
    /*
    |--------------------------------------------------------------------------
    | SMTP Host Address
    |--------------------------------------------------------------------------
    |
    | Here you may provide the host address of the SMTP server used by your
    | applications. A default option is provided that is compatible with
    | the Mailgun mail service which will provide reliable deliveries.
    |
    */
    'host' => env('MAIL_HOST', 'smtp.gmail.com'),
    /*
    |--------------------------------------------------------------------------
    | SMTP Host Port
    |--------------------------------------------------------------------------
    |
    | This is the SMTP port used by your application to deliver e-mails to
    | users of the application. Like the host we have set this value to
    | stay compatible with the Mailgun e-mail application by default.
    |
    */
    'port' => env('MAIL_PORT', 465),
    /*
    |--------------------------------------------------------------------------
    | Global "From" Address
    |--------------------------------------------------------------------------
    |
    | You may wish for all e-mails sent by your application to be sent from
    | the same address. Here, you may specify a name and address that is
    | used globally for all e-mails that are sent by your application.
    |
    */
    'from' => [
        'address' => env('MAIL_FROM_ADDRESS', 'from@gmail.com'),
        'name' => env('MAIL_FROM_NAME', 'from'),
    ],
    /*
    |--------------------------------------------------------------------------
    | E-Mail Encryption Protocol
    |--------------------------------------------------------------------------
    |
    | Here you may specify the encryption protocol that should be used when
    | the application send e-mail messages. A sensible default using the
    | transport layer security protocol should provide great security.
    |
    */
    'encryption' => env('MAIL_ENCRYPTION', 'ssl'),
    /*
    |--------------------------------------------------------------------------
    | SMTP Server Username
    |--------------------------------------------------------------------------
    |
    | If your SMTP server requires a username for authentication, you should
    | set it here. This will get used to authenticate with your server on
    | connection. You may also set the "password" value below this one.
    |
    */
    'username' => env('MAIL_USERNAME', 'username@gmail.com'),
    'password' => env('MAIL_PASSWORD', 'password'),
    /*
    |--------------------------------------------------------------------------
    | Sendmail System Path
    |--------------------------------------------------------------------------
    |
    | When using the "sendmail" driver to send e-mails, we will need to know
    | the path to where Sendmail lives on this server. A default path has
    | been provided here, which will work well on most of your systems.
    |
    */
    'sendmail' => '/usr/sbin/sendmail -bs',
    /*
    |--------------------------------------------------------------------------
    | Markdown Mail Settings
    |--------------------------------------------------------------------------
    |
    | If you are using Markdown based email rendering, you may configure your
    | theme and component paths here, allowing you to customize the design
    | of the emails. Or, you may simply stick with the Laravel defaults!
    |
    */
    'markdown' => [
        'theme' => 'default',
        'paths' => [
            resource_path('views/vendor/mail'),
        ],
    ],
    /*
    |--------------------------------------------------------------------------
    | Log Channel
    |--------------------------------------------------------------------------
    |
    | If you are using the "log" driver, you may specify the logging channel
    | if you prefer to keep mail messages separate from other log entries
    | for simpler reading. Otherwise, the default channel will be used.
    |
    */
    'log_channel' => env('MAIL_LOG_CHANNEL'),
];

untuk di laravel file config/mail.php secara default sudah ada, akan tetapi pada lumen kita harus membuatnya secara manual.

Sekarang kita bisa melakukan registrasi user baru, dan cek di inbox mail apakah sudah terkirim atau belum.

berikut adalah contoh email yang sudah berhasil terkirim ke user.

pada link aktivation di contoh email akan mengarah ke frontend anda, karena pada studi kasus ini kita hanya membuat rest api, maka langkah selanjutnya adalah membuat function untuk verifikasi dan aktivasi user berdasarkan kode activationnya.

Verifikasi dan aktivasi user

setelah user sukses melakukan registrasi, selanjutnya adalah membuat aktivasi user berdasarkan token yang sudah dikirim di email user

tambahkan sebuah route baru di web.php seperti berikut

$router->post('verifikasi','WebController@verifikasi_email');

lalu tambahkan fungsi verifikasi_email pada file WebController.php seperti berikut

public function verifikasi_email(Request $request)
{
    $id = $request->input('id');

    $user = User::where('token', $id)
        ->where('active','N')
        ->first();

    if($user)
    {
        $ac = \App\Models\User::find($user->id);
        $ac->active = 'Y';
        $ac->email_verified_at = date('Y-m-d H:i:s');
        $ac->token = Str::random(40) . $user->email;
        $ac->save();

        $data = array( 
            'success'=>true,
            'message'=>'Your Account has been Activated, <br> Now you can Login using your <strong>Username / Email</strong>',
        );
    }else{
        $data = array( 
            'success'=>false,
            'message'=>'Account not found'
        );
    }

    return $data;
}

sekarang kita coba aktivasi user berdasarkan token yang sudah kita dapatkan melalu email kita dengan postman

Login

pada fitur login ini, kita akan menggunakan package tambahan yaitu passport dari https://github.com/dusterio/lumen-passport

untuk menginstallnya, kita bisa buka terminal/cmd lalu mengetikkan perintah berikut

composer require dusterio/lumen-passport

lalu tambahkan code berikut pada file bootstrap > app.php

$app->register(Laravel\Passport\PassportServiceProvider::class);
$app->register(Dusterio\LumenPassport\PassportServiceProvider::class);

kemudian, migrate dan install laravel passport melalui terminal/cmd

# buat tabel baru untuk Passport
php artisan migrate
# Install encryption keys Passport
php artisan passport:install

setelah proses migrate dan install laravel passport berhasil, kemudian buat sebuah file pada folder config dengan nama auth.php, kemudian isi seperti berikut

buka file user.php pada folder App > Models, lalu tambahkan pasport pada model user.php

//tambahkan baris ini
use Laravel\Passport\HasApiTokens;
class User extends Model implements AuthenticatableContract, AuthorizableContract
{
     //lalu tambahkan HasApiTokens seperti berikut
     use HasApiTokens, Authenticatable, Authorizable, HasFactory;

dan juga tambahkan password pada array $fillable

protected $fillable = [
    'name', 'email','password'
];

sampai tahap ini kita sudah berhasil untuk setting passport pada project kita, selanjutnya adalah membuat sebuah route untuk login, pada file web.php tambahkan baris seperti berikut

$router->post('login','WebController@login');

lalu pada file WebController.php tambahkan fungsi login seperti berikut

public function login(Request $request)
{
    $this->validate($request,[
        'email'=>'required',
        'password'=>'required'
    ]);

    $user=\App\Models\User::where('email',$request->input('email'))
        ->where('active','Y')
        ->first();

    if($user){
        if(Hash::check($request->input('password'), $user->password)){

            $token = $user->createToken('YourApp')->accessToken;

            return array(
                'token_type'=>'Bearer', 
                'expires_in'=>60*60*24*7,
                'access_token'=>$token,
                'refresh_token'=>''
            );
        }else{
            return response()->json(
                [
                    'success'=>false,
                    'message'=>'Password wrong'
                ]
            );
        }
    }else{
        return response()->json(
            [
                'success'=>false,
                'message'=>'User Not Found'
            ]
        );
    }
}

sekarang kita coba login dengan user yang telah kita aktivasi melalui postman

Forgot Password

untuk flow sistem forgot password pada artikel ini adalah seperti berikut

  • User memasukan email
  • Sistem akan mengecek apakah email tersebut ada di database atau tidak
  • jika email ditemukan, maka akan mengirim email yang berisi link untuk recovery password
  • user memasukkan password baru

karena pada artikel ini masih berupa api, maka step 1 user memasukan email akan kita lompati dan langsung ke step 2 yaitu mengecek apakah email yang dimasukkan ada di database atau tidak.

buatlah sebuah route baru seperti berikut

$router->post('forgot-password','WebController@forgot_password');

lalu buat fungsi baru dengan nama forgot_password pada file WebController.php

public function forgot_password(Request $request)
{
    $this->validate($request, [
        'email' => 'required'
    ]);

    $email = $request->input('email');

    $user = User::where('email',$email)
      ->where('active','Y')
      ->first();

    if($user)
    {
        //send email
        $c_user = \App\Models\User::find($user->id);
        $c_user->token = Str::random(40) . $user->email;
        $c_user->save();

        $link_activation = env('FE_URL').'/recovery/'.$c_user->token;

        Mail::to($user->email)->send(new \App\Mail\ForgotPassword($user->full_name, $link_activation));

        $data = array( 
            'success'=>true,
            'message'=>'Your link forgot password has been sent mail'
        );
    }else{
        $data = array( 
            'success'=>false,
            'message'=>'Username / Email not found'
        );
    }

    return $data;
}

Email link forgot password

seperti yang sudah dijelaskan di flow sebelumnya bahwa setelah kita mengecek apakah user itu ada di database atau tidak, jika ada maka sistem akan mengirim email ke user tersebut yang berisi link untuk update password

sekarang kita buat sebuah file baru di folder App\Mail dengan nama ForgotPassword.php, lalu masukkan code sebperti berikut

<?php
namespace App\Mail;
 
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
 
class ForgotPassword extends Mailable{
 
    use Queueable, SerializesModels;
    
    public $full_name;
    public $link_activation;

    public function __construct($full_name, $link_activation)
    {
        $this->full_name = $full_name;
        $this->link_activation = $link_activation;
    }
 
    //build the message.
    public function build() {
        return $this->from(env('MAIL_FROM_ADDRESS'),env('MAIL_FROM_NAME'))
                ->subject('Password Recovery')
                ->view('emails.forgot_password');
    }
}

Email forgot password view

lalu buatkan sebuah view pada folder resources/views/emails dengan nama forgot_password.blade.php untuk tampilan email yang akan dikirim ke user, berikut contoh view untuk email yang akan dikirim ke user

<p>Hi, <strong>{{$full_name}}</strong></p>

<p>
Please visit this url to Update your password.
</p>

<p>
    <a href="{{$link_activation}}">{{$link_activation}}</a>
</p>

<p>
    Sincerely,
</p>

<p>
    Admin
</p>

<br>
<p>
This message was generated automatically. Please do not reply to this message.
</p>

sekarang kita coba untuk melakukan reset password dengan memasukkan email yang terdaftar di database, lalu seharusnya kita akan mendapatkan sebuah email untuk melakukan recovery password.

cek di inbox untuk cek link email verifikasi user

Cek user Recovery

seharusnya link yang terdapat pada email adalah sebuah kode unique yang nantinya kode itu akan dicek pada database kita apakah ada user dengan kode unique tersebut

untuk mengecek kode unique tersebut buatlah sebuah route baru seperti berikut

$router->post('cek-user-recovery','WebController@cek_user_recovery');

lalu buatlah sebuah fungsi di WebController.php dengan nama cek_user_recovery seperti berikut

public function cek_user_recovery(Request $request)
{
    $kode = $request->input('kode');

    $cek = User::where('token', $kode)
        ->first();

    if($cek)
    {
        $data = array( 
            'success'=>true,
            'message'=>'User Found'
        );
    }else{
        $data = array( 
            'message'=>false,
            'message'=>'User Not Found'
        );
    }

    return $data;
}

Update Forgot Password

langkah terakhir adalah membuat fungsi untuk meng-update data password user berdasarkan kode unique yang telah dikirim ke email.

buat sebuah route baru seperti berikut

$router->post('update-forgot-password','WebController@update_forgot_password');

lalu tambahkan fungsi berikut pada pada Controller

public function update_forgot_password(Request $request)
{
    $this->validate($request, [
          'kode'=>'required',
          'password'=>'required|confirmed',
          'password_confirmation'=>'required'
    ]);
        
    $kode = $request->input('kode');

    $cek = User::where('token', $kode)
        ->first();

    if($cek)
    {
        $password = $request->input('password');
        $password_confirmation = $request->input('password_confirmation');

        if($password == $password_confirmation)
        {
            $user = \App\Models\User::find($cek->id);
            $user->password = Hash::make($request->input('password'));
            $user->remember_token = Str::random(40) . $cek->email;
            $user->save();

            $data = array( 
                'success'=>true,
                'message'=>'Your Password has been change'
            );   
        }else{
            $data = array( 
                'success'=>false,
                'message'=>'Password doesnt match'
            );
        }
    }else{
        $data = array( 
            'message'=>false,
            'message'=>'User Not Found'
        );
    }

    return $data;
}

Selesai sudah, coba kita cek untuk update passwordnya di postman.

Terima Kasih.

Untuk Full Codenya anda bisa lihat di repo berikut.

https://github.com/jamalapriadi/lumen_register_login_forgot_password

Share your love