Halo teman-teman semuanya, pada pembahasan artikel kali ini kita semua akan belajar membuat authentication dengan Laravel dan Vue Js. Jadi konsepnya kita akan membuat sebuah form login di Vue Js yang mana form tersebut akan mengakses Rest API dari Laravel dan mengembalikan sebuah token.
Langkah 1 - Component Login / Auth
Silahkan buka file src/views/auth/Index.vue dan kemudian ubah semua kode-nya menjadi seperti berikut ini :
<template>
<div class="login">
<div class="container" style="margin-top:100px">
<div class="row justify-content-center">
<div class="col-md-5">
<div v-if="loginFailed" class="alert alert-danger">
Email atau Password Anda salah.
</div>
<div class="card">
<div class="card-body">
LOGIN
<hr>
<form @submit.prevent="login">
<div class="form-group">
<label>EMAIL</label>
<input type="email" class="form-control" v-model="user.email"
placeholder="Masukkan Email">
<div v-if="validation.email" class="mt-2 alert alert-danger">
Masukkan Email
</div>
</div>
<div class="form-group">
<label>PASSWORD</label>
<input type="password" class="form-control" v-model="user.password"
placeholder="Masukkan Password">
<div v-if="validation.password" class="mt-2 alert alert-danger">
Masukkan Password
</div>
</div>
<button type="submit" class="btn btn-primary">LOGIN</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'Login',
data() {
return {
//state loggedIn with localStorage
loggedIn: localStorage.getItem('loggedIn'),
//state token
token: localStorage.getItem('token'),
//state user
user: [],
//state validation
validation: [],
//state login failed
loginFailed: null
}
},
methods: {
login() {
if (this.user.email && this.user.password) {
axios.get('http://localhost:8000/sanctum/csrf-cookie')
.then(response => {
//debug cookie
console.log(response)
axios.post('http://localhost:8000/api/login', {
email: this.user.email,
password: this.user.password
}).then(res => {
//debug user login
console.log(res)
if (res.data.success) {
//set localStorage
localStorage.setItem("loggedIn", "true")
//set localStorage Token
localStorage.setItem("token", res.data.token)
//change state
this.loggedIn = true
//redirect dashboard
return this.$router.push({ name: 'dashboard' })
} else {
//set state login failed
this.loginFailed = true
}
}).catch(error => {
console.log(error)
})
})
}
this.validation = []
if (!this.user.email) {
this.validation.email = true
}
if (!this.user.password) {
this.validation.password = true
}
}
},
//check user already logged in
mounted() {
if (this.loggedIn) {
return this.$router.push({ name: 'dashboard' })
}
}
}
</script>
Dari penambahan kode di atas mari kita bahas satu-satu mulai dari awal.
Pertama kita import axios terlebih dahulu, karena kita akan membutuhkan Axios untuk melakukan HTTP Request ke server untuk melakukan authentication.
import axios from 'axios'
Kemudian kita define beberapa state atau properti data, diantaranya adalah :
- loggedIn
- token
- user
- validation
- loginFailed
loggedIn
loggedIn ini akan diisi oleh data yang di ambil dari localStorage dengan key loggedIn, dimana ini hanya akan mengembalikan nilai bolean yaitu true atau false.
//state loggedIn with localStorage
loggedIn: localStorage.getItem('loggedIn'),
token
token juga akan diisi oleh data yang diambil dari localStorage dengan key token. Token ini akan kita manfaatkan untuk mendapatkan data ke server sebagai header dengan tipe Authorization dan Bearer.
//state token
token: localStorage.getItem('token'),
user
user merupakan state atau propert dengan nilai array, ini akan kita gunakan untuk menampung nilai dari data yang diinputkan di form menggunakan directive v-model.
//state user
user: [],
validation
validation akan digunakan untuk menampilkan message validasi jika inputan yang dimasukkan kosong.
//state validation
validation: [],
loginFailed
state atau properti ini secara default memiliki nilai null, ini akan diisi menjadi true apabila response dari authentication gagal dan kita akan menampilkan pesan login gagal di dalam template.
//state login failed
loginFailed: null
Kemduain kita buat methods login, dimana fungsi ini akan di jalankan saat kita melakukan submit di dalam form login, di dalam fungsi login pertama kita cek terlebih dahulu apakah properti user.email dan user.password tidak kosong, kemudian akan melakukan request ke CSRF COOKIE dari Laravel Sanctum.
axios.get('http://localhost:8000/sanctum/csrf-cookie')
Kemudian setelah itu di dalamnya kita melakukan request lagi ke server untuk proses authentication dengan email dan password.
axios.post('http://localhost:8000/api/login', {
email: this.user.email,
password: this.user.password
})
Jika response success bernilai true, maka kita akan mengisi beberapa data dari localStorage dan state atau properti.
if (res.data.success) {
//set localStorage
localStorage.setItem("loggedIn", "true") // <— set localStorage loggedIn menjadi true
//set localStorage Token
localStorage.setItem("token", res.data.token) // <— simpan token dari response ke dalam localStorage token
//change state
this.loggedIn = true // <— ubah state atau properti loggedIn menjadi true
//redirect dashboard
return this.$router.push({ name: 'dashboard' }) // <— redirect ke route atau halaman dashboard
}
Di atas jika kita response dari server berhasil maka akan melakukan beberapa perubahan data, diantaranya adalah merubah nilai dari localStorage loggedIn menjadi true.
Kemudian memasukkan token dari hasil response ke dalam localStorage yang bernama token. Selanjutnya merubah nilai state atau properti loggedIn menjadi true dan yang terakhir mengarahkan ke route atau halaman dashboard.
Jika response success bernilai false, maka state atau properti loginFailed akan di rubah nilainya menjadi true dan akan menampilkan error message di template seperti berikut ini :
<div v-if="loginFailed" class="alert alert-danger">
Email atau Password Anda salah.
</div>
Kemudian untuk cek input validasi kita bisa menggunakan seperti berikut ini :
this.validation = []
if (!this.user.email) {
this.validation.email = true
}
if (!this.user.password) {
this.validation.password = true
}
Kemudian untuk menampilkannya di template kurang lebih seperti berrikut ini :
<div v-if="validation.email" class="mt-2 alert alert-danger">
Masukkan Email
</div>
<div v-if="validation.password" class="mt-2 alert alert-danger">
Masukkan Password
</div>
Kemudian yang terakhir kita tambahkan properti mounted, dimana ini akan digunakan untuk mengecek apakah nilai dari state atau properti loggedIn bernilai true, jika iya maka akan di arahkan ke route atau halaman dashboard. Ini akan berfungsi jika user yang sudah login tapi ingin mengakses halaman login kembali.
Langkah 2 - Uji Coba Authentication
Sekarang kita bisa coba jalankan project Vue Js kita, jalankan perintah di bawah ini untuk menjalankan server.
npm run serve
Dan kurang lebih hasilnya seperti berikut ini :

kemudian silahkan klik button login, maka kurang lebih tampilannya seperti berikut ini :

Sekarang kita akan coba memasukkan email dan password, jika berhasil kita akan di redirect ke halaman dashboard. Kurang lebih seperti berikut ini :

Sekarang kita sudah berhasil melakukan authentication menggunakan Laravel dan Vue Js, akan tetapi sebenarnya disini masih ada problem, kita bisa mengakses halaman dashboard tersebut tanpa harus melakukan authentication.
Jika kita inspect element pada broswer kemudian pilih tab Application kemudian pilih bagian Cookies, maka teman-teman bisa melihat CSRF TOKEN dari Laravel Sanctum kurang lebih seperti berikut ini :

Kemudian buka juga di bagian local Storage, maka kita akan mendapatkan 2 data yaitu loggedIn yang bernilai true dan token yang bernilai token yang di dapatkan dari response server.

Di artikel selanjuntnya kita akan belajar menampilkan data user yang sudah login dan cek untuk halaman dashboard hanya bisa diakses oleh user yang sudah login.
EBOOK MEMBANGUN WEBSITE SEKOLAH DENGAN LARAVEL, VUE JS DAN BOOTSTRAP 5 : https://bit.ly/ebook-laravel-vue-js
{ setTimeout(() => { showShimmer = false; }, 300); })"
:class="{'opacity-0': !loaded, 'opacity-100': loaded}"
class="lazy w-full h-auto rounded-xl border border-white dark:border-neutral-700/80 transition-opacity duration-500"
loading="lazy"
/>
SAWERIA
Memuat komentar...