andriajah Thu Jan 2022 1 year ago

Membuat Api Login Auth dengan Sanctum di Laravel 8

Untuk pengembang web, penting bagi kami untuk mengautentikasi pengguna kami melalui Permintaan API. Di Laravel sendiri, selain pengembangan full-stack, kami memiliki banyak opsi tentang cara mengautentikasi permintaan. Misalnya, kami memiliki paket Laravel Passport untuk melakukan proses otentikasi dan OAuth. Tapi, jika Anda tidak ingin menggunakan fitur OAuth yang ditawarkan Passport, maka Laravel Sanctum mungkin bisa menjadi pilihan untuk Anda.

Apa itu Laravel Sanctum?

Laravel Sanctum menyediakan sistem otentikasi kelas bulu untuk SPA (aplikasi satu halaman), aplikasi seluler, dan API berbasis token sederhana ( https://laravel.com/docs/8.x/sanctum )

Ya, di Sanctum, kami memiliki dua opsi di sini. Yang pertama adalah Otentikasi Token API, dan yang kedua adalah Otentikasi SPA. Ada otentikasi lain seperti Aplikasi Seluler, tetapi otentikasi ini memiliki proses yang mirip dengan Otentikasi Token API.

Jadi pertanyaan selanjutnya, apa perbedaan API Token dan SPA Authentication? Otentikasi Token API menggunakan Token yang harus dikeluarkan klien/front-end Anda terlebih dahulu sebelum mengirim permintaan apa pun ke server. Klien Anda mendapatkan Token melalui rute /login , kemudian setiap permintaan berikutnya, token harus dimasukkan dalam header Otorisasi sebagai token Pembawa . Cukup sederhana bukan?

Otentikasi SPA, di sisi lain, tidak memerlukan token apa pun. Sebagai gantinya, ia menggunakan layanan otentikasi sesi berbasis cookie bawaan Laravel. Ketika kita sedang menggunakan jenis otentikasi, kita tidak perlu menyertakan para Otorisasi Pembawa header pada setiap permintaan. Ini berguna ketika Anda sedang membangun SPA pihak pertama, bahwa proyek front-end Anda dapat berada di dalam proyek Laravel Anda atau repositori/proyek yang sepenuhnya terpisah.

Jadi dalam artikel ini, saya akan menunjukkan cara membangun Otentikasi Token API menggunakan Sanctum. Ini adalah proyek yang sangat sederhana, dan tentu saja, Anda dapat melihat repositori lengkapnya di bagian bawah artikel ini.

# 1 Buat Project & Instalasi Sanctum

Oke, yang pertama, mari kita buat proyek Laravel yang baru.

composer create-project laravel/laravel --prefer-dist laravel-sanctum

Setelah instalasi berhasil, instal paket Laravel Sanctum.

composer require laravel/sanctum

Kemudian publikasikan file konfigurasi dan migrasi Sanctum. File konfigurasi Sanctum akan ditempatkan di dalam direktori konfigurasi Anda.

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

Selanjutnya, migrasikan database Anda. Jangan lupa untuk menyesuaikan konfigurasi database Anda di dalam file .env Anda .

php artisan migrate

Satu hal terakhir, model Pengguna Anda perlu menggunakan model Laravel\Sanctum\HasApiTokens , sehingga kami dapat mengeluarkan token dengan metode createToken() .

<?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\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasFactory, Notifiable, HasApiTokens;

    /**
     * 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',
    ];

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

2 Route Authentication

Saatnya untuk bagian penting. Sebelum kita melanjutkan membangun route autentikasi, lebih baik jika kita membuat model Respons API sehingga kita dapat mengembalikan respons yang konsisten dengan cara yang sederhana. Mari buat file di dalam App\Traits\ApiResponser.php . Jangan ragu jika Anda ingin membuat perubahan pada model tersebut.

<?php

namespace App\Traits;

use Carbon\Carbon;

/*
|--------------------------------------------------------------------------
| Api Responser Trait
|--------------------------------------------------------------------------
|
| This trait will be used for any response we sent to clients.
|
*/

trait ApiResponser
{
	/**
     * Return a success JSON response.
     *
     * @param  array|string  $data
     * @param  string  $message
     * @param  int|null  $code
     * @return \Illuminate\Http\JsonResponse
     */
	protected function success($data, string $message = null, int $code = 200)
	{
		return response()->json([
			'status' => 'Success',
			'message' => $message,
			'data' => $data
		], $code);
	}

	/**
     * Return an error JSON response.
     *
     * @param  string  $message
     * @param  int  $code
     * @param  array|string|null  $data
     * @return \Illuminate\Http\JsonResponse
     */
	protected function error(string $message = null, int $code, $data = null)
	{
		return response()->json([
			'status' => 'Error',
			'message' => $message,
			'data' => $data
		], $code);
	}

}

Pertama, mari kita mulai dengan scaffolding titik akhir dasar. Buka route/api.php Anda dan modifikasi.

<?php

use App\Http\Controllers\AuthController;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::post('/auth/register', [AuthController::class, 'register']);

Route::post('/auth/login', [AuthController::class, 'login']);

Route::group(['middleware' => ['auth:sanctum']], function () {
    Route::get('/me', function(Request $request) {
        return auth()->user();
    });

    Route::post('/auth/logout', [AuthController::class, 'logout']);
});

Pada baris 19 dan 20, kita akan mengimplementasikan fungsi register dan login. Dan pada baris 23–28, kami melindungi route dengan middleware “auth:sanctum” sehingga hanya pengguna yang diautentikasi yang dapat mengaksesnya. Pada baris 24, kami kemudian mengembalikan pengguna yang diautentikasi menggunakan auth()->user() .

Buat controller baru di dalam App\Http\Controllers\AuthController.php dan modifikasi.

<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Traits\ApiResponser;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    use ApiResponser;

    public function register(Request $request)
    {
        $attr = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|unique:users,email',
            'password' => 'required|string|min:6|confirmed'
        ]);

        $user = User::create([
            'name' => $attr['name'],
            'password' => bcrypt($attr['password']),
            'email' => $attr['email']
        ]);

        return $this->success([
            'token' => $user->createToken('API Token')->plainTextToken
        ]);
    }

    public function login(Request $request)
    {
        $attr = $request->validate([
            'email' => 'required|string|email|',
            'password' => 'required|string|min:6'
        ]);

        if (!Auth::attempt($attr)) {
            return $this->error('Credentials not match', 401);
        }

        return $this->success([
            'token' => auth()->user()->createToken('API Token')->plainTextToken
        ]);
    }

    public function logout()
    {
        auth()->user()->tokens()->delete();

        return [
            'message' => 'Tokens Revoked'
        ];
    }
}

Pada fungsi register() , kita memiliki logika yang sangat sederhana. Pertama, kami memvalidasi permintaan yang dikirim klien, lalu kami membuat pengguna baru. Hal terakhir yang harus dilakukan, kami mengirim kembali Token API ke klien. Pada baris 30 dan 46 adalah cara bagaimana kami dapat membuat token untuk pengguna. Kita membutuhkan parameter string yang diteruskan pada fungsi createToken() yang bisa kita ketik dengan apa saja. Sekedar tip dari saya, Anda dapat melewatkan parameter string dengan nama perangkat seperti Iphone12, Macbook, dll.

Untuk fungsi logout() itu sendiri, kita bisa revoked tokennya saja. Maka token akan otomatis tidak valid jika klien meminta dengan token yang revoked/deleted.

#3 Ayo Uji!

Pertama, mari kita coba langkah pendaftarannya.

Setelah pendaftaran berhasil, kami akan menerima token. Kemudian, kita akan membuat permintaan lain ke /api/me untuk menguji apakah titik akhir akan mengembalikan pengguna terautentikasi yang benar dengan benar. Jangan lupa, Anda memerlukan Otorisasi header dengan token Bearer.

Seperti yang Anda lihat dari hasil di atas, titik akhir mengirim kembali pengguna yang diautentikasi dengan benar. Cobalah untuk menghapus token, atau membuatnya menjadi token yang tidak valid sehingga Anda menjadi tidak diautentikasi.

Ini adalah tutorial sederhana tentang bagaimana kami menggunakan Sanctum untuk Otentikasi API. Tapi, seperti yang Anda tahu, Sanctum juga memiliki beberapa fitur, misalnya, Anda dapat dengan mudah mengelola dan menetapkan kemampuan token dengan menggunakan perintah ini:

return $user->createToken('token-name', ['server:update'])->plainTextToken;

Dan periksa kemampuan token pengguna dengan:

if ($user->tokenCan('server:update')) {
    //
}

Itu saja tentang bagaimana kita dapat menggunakan Sanctum untuk melakukan proses Otentikasi API. Semoga artikel ini bisa menjadi referensi yang baik untuk Anda dan sampai jumpa di lain waktu.

 

laravel tutorial laravel laravel 8 auth api with sanctum laravel 8