Langsung ke konten utama

Hindari Serangan Hacker dengan Login OTP Email di Laravel


Pertama-tama, kita perlu memastikan bahwa kita telah mengatur Laravel dengan benar untuk menggunakan email sebagai cara otentikasi. Untuk melakukan ini, kita harus mengkonfigurasi driver otentikasi ke "eloquent" di file config/auth.php dan memastikan bahwa model User kita menggunakan trait Illuminate\Auth\Authenticatable.

Setelah melakukan konfigurasi, kita dapat membuat sebuah form login di view yang akan meminta email dari user. Setelah user mengirimkan email mereka, kita akan menghasilkan sebuah OTP dan mengirimkannya ke alamat email yang diberikan oleh user.

Untuk menghasilkan OTP, kita dapat menggunakan library PHP yang disebut OTPHP. Untuk menginstal library ini, kita dapat menambahkan otphp/otphp ke dalam composer.json dan menjalankan perintah composer update.

Setelah library diinstal, kita dapat membuat sebuah method pada User model untuk menghasilkan OTP:

public function generateOTP()
{
    $totp = new \OTPHP\TOTP('JBSWY3DPEHPK3PXP');
    return $totp->now();
}

Dalam contoh di atas, kita menggunakan secret key JBSWY3DPEHPK3PXP untuk menghasilkan OTP. Kita sebaiknya menambahkan key ini pada file .env untuk menghindari mengekspos key ini secara langsung di dalam code.

Setelah kita menghasilkan OTP, kita dapat mengirimkan email kepada user dengan link untuk masuk ke halaman verifikasi. Kita bisa menggunakan library illuminate/mail untuk mengirimkan email.

public function sendOTP($otp)
{
    $email = new \Illuminate\Mail\Message();
    $email->subject('Login OTP');
    $email->to($this->email);
    $email->setBody('Kode OTP: '.$otp);
    \Illuminate\Support\Facades\Mail::send($email);
}

Dalam contoh di atas, kita menggunakan method sendOTP pada model User untuk mengirimkan email. Email yang dikirimkan hanya berisi kode OTP yang diberikan kepada user.

Setelah user menerima email dengan kode OTP, mereka harus memasukkan kode tersebut pada halaman verifikasi. Jika kode OTP benar, maka user akan dianggap berhasil masuk ke aplikasi.

Berikut adalah kode lengkap untuk mengimplementasikan login menggunakan OTP di Laravel:

use OTPHP\TOTP;
use Illuminate\Support\Facades\Mail;

class LoginController extends Controller
{
    public function showLoginForm()
    {
        return view('auth.login');
    }

    public function login(Request $request)
    {
        $user = User::where('email', $request->email)->first();

        if (!$user) {
            return redirect()->back()->withErrors(['email' => 'Email tidak ditemukan']);
        }

        $otp = $user->generateOTP();
        $user->sendOTP($otp);

        $request->session()->put('otp', $otp);
        $request->session()->put('email', $request->email);

        return redirect()->route('otp.verify');
    }

    public function showOTPVerificationForm(Request $request)
    {
        if (!$request->session()->has('otp')) {
            return redirect()->route('login');
        }

        return view('auth.verify-otp');
    }

    public function verify(Request $request)
    {
    if (!$request->session()->has('otp')) {
        return redirect()->route('login');
    }

    $otp = $request->input('otp');
    $email = $request->session()->get('email');

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

    if (!$user) {
        return redirect()->route('login');
    }

    $totp = new TOTP(env('OTP_SECRET'));
    if (!$totp->verify($otp, $user->generateOTP())) {
        return redirect()->back()->withErrors(['otp' => 'Kode OTP salah']);
    }

    auth()->login($user);
    $request->session()->forget('otp');
    $request->session()->forget('email');

    return redirect()->intended('/');
    }
}

Di dalam kode di atas, pertama-tama kita menangkap email dari form login. Kemudian, kita mencari user dengan email yang diberikan di dalam database. Jika user tidak ditemukan, maka kita akan mengembalikan pesan error.

Jika user ditemukan, kita menghasilkan sebuah OTP menggunakan method `generateOTP` yang kita buat di dalam model User. Setelah menghasilkan OTP, kita mengirimkannya ke email user menggunakan method `sendOTP`.

Setelah mengirimkan email OTP, kita menyimpan OTP dan email user di dalam session dan mengarahkan user ke halaman verifikasi OTP. Di halaman verifikasi OTP, user diminta untuk memasukkan kode OTP yang diberikan.

Jika kode OTP benar, maka kita akan menganggap bahwa user telah terotentikasi dan kita akan memasukkan user ke dalam sesi aplikasi. Setelah itu, kita akan menghapus OTP dan email user dari session dan mengarahkan user ke halaman yang dimaksud sebelumnya (jika ada).

Itulah cara melakukan otentikasi login menggunakan One Time Password (OTP) dengan email di Laravel. Semoga bermanfaat!


Komentar

Postingan populer dari blog ini

Fungsi lain tombol penerima panggilan di headset

Kegunaan tombol yang berada di headset utamanya adalah untuk menerima panggilan dan pause panggilan. Dan headset itu sendiri, kadang juga digunakan untuk mendengarkan music, digunakan bersama saat main game, supaya suara yang dikeluarkan oleh gadget tidak terlalu keras sehingga mengurangi beban gadget. Dengan mengurangi beban gadget, ada beberapa yang beranggapan kalau itu akan menghemat batere.

Apa itu index file seperti index.html, index.php kegunaannya dan bagaimana membuat custom nya

Index file adalah file yang berfungsi sebagai halaman utama atau tampilan pertama dari sebuah website. File ini memiliki nama default yang bervariasi, tergantung pada jenis server dan konfigurasinya, namun beberapa nama default yang umum digunakan adalah index.html, index.php, index.jsp, atau index.asp.

Membersihkan cache dan dalvik-cache menggunakan link2sd

Mungkin banyak yang menanyakan kenapa internalnya selalu berkurang free space nya. Padahal tidak menginstall applikasi baru. Hanya melakukan aktifitas normal. Dan sampai pada waktunya, internal memory low dan tidak bisa menambah aplikasi baru lagi.  Ada kemungkinan file cache dari sebuah aplikasi atau dalvik yang dibuat oleh OS android sudah  mulai membengkak. Sehingga perlu di bersihkan secara manual supaya tersedia penyimpanan kosong yang banyak. Sebelum mengetahui cara membersihkan cache dan dalvik cache, kita kupas sekilas apa itu cache dan dalvik cache. Cache adalah sebuah data file sementara yang di hasilkan oleh sebuah applikasi guna mempercepat pemrosesan dimasa yang akan datang (Cache Wikipedia) .  Dalvik-cache adalah ruang kosong sementara yang di pake oleh java virtual machine untuk menjalankan aplikasi android (Dalvik Wikipedia) .