m.techreview.click
  • Website
  • Indonesia
  • Laravel
  • Hosting
  • AI
  • Development
No Result
View All Result
m.techreview.click
  • Website
  • Indonesia
  • Laravel
  • Hosting
  • AI
  • Development
No Result
View All Result
m.techreview.click
No Result
View All Result
Home API

Cara Membuat API dengan Laravel dan JWT: Keamanan dan Integrasi Data

Jasper by Jasper
June 10, 2025
in API, Data, Integrasi, Keamanan, Laravel
0
Share on FacebookShare on Twitter

Dalam era digital ini, API (Application Programming Interface) menjadi tulang punggung banyak aplikasi web dan mobile. Mereka memungkinkan aplikasi yang berbeda untuk berkomunikasi dan berbagi data satu sama lain. Laravel, sebuah framework PHP yang elegan, dan JWT (JSON Web Token), sebuah standar industri untuk autentikasi, adalah kombinasi yang sangat kuat untuk membangun API yang aman dan mudah diintegrasikan. Artikel ini akan membahas secara mendalam cara membuat API dengan Laravel dan JWT, berfokus pada keamanan dan kemudahan integrasi data.

Apa Itu API dan Mengapa Menggunakan Laravel?

API adalah seperangkat aturan dan spesifikasi yang memungkinkan aplikasi untuk berkomunikasi satu sama lain. Bayangkan API seperti pelayan di restoran. Anda memesan makanan (meminta data) dari menu (API endpoint), dan pelayan (API) membawakan makanan tersebut (data) dari dapur (server).

Mengapa Laravel? Karena Laravel menawarkan banyak keuntungan:

  • Elegan dan Ekspresif: Sintaks Laravel yang bersih dan mudah dibaca membuat pengembangan API menjadi lebih menyenangkan dan efisien.
  • Keamanan Terintegrasi: Laravel memiliki fitur keamanan bawaan seperti proteksi CSRF, sanitasi input, dan perlindungan SQL injection.
  • ORM Eloquent: Eloquent ORM (Object-Relational Mapper) memudahkan interaksi dengan database, meminimalkan kode boilerplate dan meningkatkan produktivitas.
  • Artisan Console: Artisan CLI menyediakan banyak perintah yang berguna untuk scaffolding kode, migrasi database, dan tugas-tugas lainnya.
  • Komunitas Aktif: Laravel memiliki komunitas pengembang yang besar dan aktif, sehingga Anda dapat dengan mudah menemukan bantuan dan sumber daya saat membutuhkannya.

Keamanan API dengan JWT: Autentikasi yang Kuat

JWT (JSON Web Token) adalah standar industri untuk autentikasi dan otorisasi API. JWT adalah token JSON yang ditandatangani secara digital dan berisi informasi (klaim) tentang pengguna atau aplikasi yang mencoba mengakses API.

Related Post

Membuat API Authentication dengan Laravel Sanctum: Panduan Lengkap

June 26, 2025

Cara Meningkatkan Keamanan Website Laravel dari Serangan Hacker

June 26, 2025

Top 5 Package Laravel yang Mempermudah Pengembangan Website Anda

June 26, 2025

Cara Menggunakan Laravel Eloquent untuk Query Database: Panduan Lengkap

June 25, 2025

JWT bekerja dengan cara berikut:

  1. Login: Pengguna mengirimkan kredensial (username dan password) ke server.
  2. Otentikasi: Server memvalidasi kredensial tersebut.
  3. Penerbitan Token: Jika kredensial valid, server menerbitkan JWT yang ditandatangani dengan kunci rahasia.
  4. Pengiriman Token: JWT dikirim kembali ke klien (misalnya, aplikasi web atau mobile).
  5. Penyimpanan Token: Klien menyimpan JWT (biasanya di local storage atau cookie).
  6. Akses API: Setiap kali klien ingin mengakses API, ia menyertakan JWT di header Authorization (biasanya menggunakan skema Bearer).
  7. Verifikasi Token: Server menerima permintaan API dan memverifikasi JWT. Jika JWT valid dan tidak kedaluwarsa, server memproses permintaan tersebut.

JWT memberikan banyak keuntungan dibandingkan metode autentikasi tradisional seperti session cookies:

  • Scalable: Karena JWT tidak menyimpan state di server, API dapat diskalakan secara horizontal dengan mudah.
  • Cross-Domain: JWT dapat digunakan untuk mengautentikasi pengguna di berbagai domain.
  • Mobile-Friendly: JWT sangat cocok untuk aplikasi mobile karena ukurannya yang kecil dan mudah disimpan.
  • Standardized: JWT adalah standar industri yang didukung oleh banyak bahasa pemrograman dan framework.

Persiapan Lingkungan Pengembangan Laravel untuk API

Sebelum mulai membuat API, pastikan Anda sudah memiliki lingkungan pengembangan Laravel yang siap. Ikuti langkah-langkah berikut:

  1. Instalasi PHP dan Composer: Pastikan Anda sudah menginstal PHP (minimal versi 8.0) dan Composer (dependency manager untuk PHP).

  2. Instalasi Laravel: Gunakan Composer untuk menginstal Laravel:

    composer create-project --prefer-dist laravel/laravel nama-projek-api
    cd nama-projek-api
  3. Konfigurasi Database: Konfigurasi koneksi database di file .env. Isi informasi database seperti nama database, username, dan password.

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=nama_database
    DB_USERNAME=username_database
    DB_PASSWORD=password_database
  4. Konfigurasi Aplikasi: Generate key aplikasi menggunakan perintah artisan.

    php artisan key:generate
  5. Instalasi Package JWT: Instal package tymon/jwt-auth untuk implementasi JWT.

    composer require tymon/jwt-auth
  6. Konfigurasi JWT: Publish file konfigurasi JWT.

    php artisan vendor:publish --tag=jwt

    Anda mungkin perlu mengkonfigurasi beberapa opsi di config/jwt.php sesuai kebutuhan Anda.

Membuat Model, Migrasi, dan Seeder untuk Data API

Selanjutnya, kita akan membuat model, migrasi, dan seeder untuk data yang akan kita expose melalui API. Sebagai contoh, kita akan membuat API untuk mengelola daftar buku.

  1. Buat Model Buku:

    php artisan make:model Book -mfs

    Perintah ini akan membuat model Book, migrasi untuk membuat tabel books, dan factory untuk membuat data dummy.

  2. Edit Migrasi: Buka file migrasi database/migrations/*_create_books_table.php dan definisikan struktur tabel books.

    <?php
    
    use IlluminateDatabaseMigrationsMigration;
    use IlluminateDatabaseSchemaBlueprint;
    use IlluminateSupportFacadesSchema;
    
    class CreateBooksTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('books', function (Blueprint $table) {
                $table->id();
                $table->string('title');
                $table->string('author');
                $table->text('description')->nullable();
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('books');
        }
    }
  3. Jalankan Migrasi:

    php artisan migrate
  4. Edit Model: Buka file model app/Models/Book.php dan definisikan properti $fillable untuk menentukan kolom mana yang boleh diisi.

    <?php
    
    namespace AppModels;
    
    use IlluminateDatabaseEloquentFactoriesHasFactory;
    use IlluminateDatabaseEloquentModel;
    
    class Book extends Model
    {
        use HasFactory;
    
        protected $fillable = [
            'title',
            'author',
            'description',
        ];
    }
  5. Edit Seeder: Buka file seeder database/seeders/DatabaseSeeder.php dan tambahkan seeder untuk Book.

    <?php
    
    namespace DatabaseSeeders;
    
    use IlluminateDatabaseSeeder;
    
    class DatabaseSeeder extends Seeder
    {
        /**
         * Seed the application's database.
         *
         * @return void
         */
        public function run()
        {
            AppModelsBook::factory(10)->create();
        }
    }
  6. Jalankan Seeder:

    php artisan db:seed

Membuat Controller API dan Route dengan Autentikasi JWT

Sekarang kita akan membuat controller API untuk mengelola data buku dan mengamankan route API menggunakan JWT.

  1. Buat Controller API:

    php artisan make:controller Api/BookController --api

    Perintah ini akan membuat controller app/Http/Controllers/Api/BookController.php dengan method-method standar untuk operasi CRUD (Create, Read, Update, Delete).

  2. Implementasikan Logic Controller: Isi method-method di BookController dengan logic untuk mengelola data buku.

    <?php
    
    namespace AppHttpControllersApi;
    
    use AppHttpControllersController;
    use AppModelsBook;
    use IlluminateHttpRequest;
    use IlluminateSupportFacadesValidator;
    
    class BookController extends Controller
    {
        /**
         * Display a listing of the resource.
         *
         * @return IlluminateHttpResponse
         */
        public function index()
        {
            $books = Book::all();
            return response()->json(['data' => $books], 200);
        }
    
        /**
         * Store a newly created resource in storage.
         *
         * @param  IlluminateHttpRequest  $request
         * @return IlluminateHttpResponse
         */
        public function store(Request $request)
        {
            $validator = Validator::make($request->all(), [
                'title' => 'required',
                'author' => 'required',
            ]);
    
            if ($validator->fails()) {
                return response()->json(['error' => $validator->errors()], 400);
            }
    
            $book = Book::create($request->all());
            return response()->json(['data' => $book], 201);
        }
    
        /**
         * Display the specified resource.
         *
         * @param  AppModelsBook  $book
         * @return IlluminateHttpResponse
         */
        public function show(Book $book)
        {
            return response()->json(['data' => $book], 200);
        }
    
        /**
         * Update the specified resource in storage.
         *
         * @param  IlluminateHttpRequest  $request
         * @param  AppModelsBook  $book
         * @return IlluminateHttpResponse
         */
        public function update(Request $request, Book $book)
        {
            $validator = Validator::make($request->all(), [
                'title' => 'required',
                'author' => 'required',
            ]);
    
            if ($validator->fails()) {
                return response()->json(['error' => $validator->errors()], 400);
            }
    
            $book->update($request->all());
            return response()->json(['data' => $book], 200);
        }
    
        /**
         * Remove the specified resource from storage.
         *
         * @param  AppModelsBook  $book
         * @return IlluminateHttpResponse
         */
        public function destroy(Book $book)
        {
            $book->delete();
            return response()->json(['message' => 'Book deleted'], 204);
        }
    }
  3. Definisikan Route API: Buka file routes/api.php dan definisikan route untuk BookController. Gunakan middleware jwt.auth untuk mengamankan route.

    <?php
    
    use AppHttpControllersApiBookController;
    use IlluminateHttpRequest;
    use IlluminateSupportFacadesRoute;
    
    /*
    |--------------------------------------------------------------------------
    | 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::middleware('auth:sanctum')->get('/user', function (Request $request) {
        return $request->user();
    });
    
    Route::group(['middleware' => 'jwt.auth'], function () {
        Route::apiResource('books', BookController::class);
    });
    
  4. Buat Controller untuk Autentikasi: Buat controller untuk menangani login dan register.

   php artisan make:controller Api/AuthController

Isi controller app/Http/Controllers/Api/AuthController.php dengan logic untuk login dan register.

   <?php

   namespace AppHttpControllersApi;

   use AppHttpControllersController;
   use IlluminateHttpRequest;
   use IlluminateSupportFacadesAuth;
   use AppModelsUser;
   use IlluminateSupportFacadesValidator;

   class AuthController extends Controller
   {
       /**
        * Register a User.
        *
        * @return IlluminateHttpJsonResponse
        */
       public function register(Request $request) {
           $validator = Validator::make($request->all(), [
               'name' => 'required|string|between:2,100',
               'email' => 'required|string|email|max:100|unique:users',
               'password' => 'required|string|confirmed|min:6',
           ]);

           if($validator->fails()){
               return response()->json($validator->errors()->toJson(), 400);
           }

           $user = User::create(array_merge(
                       $validator->validated(),
                       ['password' => bcrypt($request->password)]
                   ));

           return response()->json([
               'message' => 'User successfully registered',
               'user' => $user
           ], 201);
       }

       /**
        * Log the user out (Invalidate the token).
        *
        * @return IlluminateHttpJsonResponse
        */
       public function logout() {
           auth()->logout();

           return response()->json(['message' => 'User successfully signed out']);
       }

       /**
        * Get the token array structure.
        *
        * @param  string $token
        *
        * @return IlluminateHttpJsonResponse
        */
       protected function createNewToken($token){
           return response()->json([
               'access_token' => $token,
               'token_type' => 'bearer',
               'expires_in' => auth('api')->factory()->getTTL() * 60,
               'user' => auth()->user()
           ]);
       }

       /**
        * Get a JWT via given credentials.
        *
        * @param  Request $request
        * @return IlluminateHttpJsonResponse
        */
       public function login(Request $request){
           $validator = Validator::make($request->all(), [
               'email' => 'required|email',
               'password' => 'required|string|min:6',
           ]);

           if ($validator->fails()) {
               return response()->json($validator->errors(), 422);
           }

           if (! $token = auth('api')->attempt($validator->validated())) {
               return response()->json(['error' => 'Unauthorized'], 401);
           }

           return $this->createNewToken($token);
       }

       /**
        * Get the authenticated User.
        *
        * @return IlluminateHttpJsonResponse
        */
       public function profile() {
           return response()->json(auth()->user());
       }

       /**
        * Refresh a token.
        *
        * @return IlluminateHttpJsonResponse
        */
       public function refresh() {
           return $this->createNewToken(auth()->refresh());
       }
   }
  1. Definisikan Route untuk Autentikasi: Tambahkan route untuk register, login, logout, refresh, dan profile di file routes/api.php.
   Route::group([
       'middleware' => 'api',
       'prefix' => 'auth'

   ], function ($router) {
       Route::post('/login', [AppHttpControllersApiAuthController::class, 'login']);
       Route::post('/register', [AppHttpControllersApiAuthController::class, 'register']);
       Route::post('/logout', [AppHttpControllersApiAuthController::class, 'logout']);
       Route::post('/refresh', [AppHttpControllersApiAuthController::class, 'refresh']);
       Route::post('/profile', [AppHttpControllersApiAuthController::class, 'profile']);
   });

Testing API dengan Postman atau Insomnia

Setelah API dibuat, Anda dapat mengujinya menggunakan tools seperti Postman atau Insomnia. Pastikan Anda mengirimkan JWT di header Authorization dengan skema Bearer.

  1. Dapatkan JWT: Lakukan request POST ke endpoint /api/auth/login dengan kredensial yang valid. Respons akan berisi JWT.
  2. Akses Route Terproteksi: Lakukan request ke endpoint /api/books dengan menyertakan JWT di header Authorization.

Jika JWT valid, Anda akan mendapatkan daftar buku. Jika JWT tidak valid atau kedaluwarsa, Anda akan mendapatkan error 401 Unauthorized.

Integrasi Data dengan Front-end

API yang telah dibuat dapat diintegrasikan dengan berbagai front-end seperti React, Vue.js, atau Angular. Pada dasarnya, front-end akan mengirimkan request HTTP ke API dan memproses respons yang diterima.

Pastikan Anda menggunakan library HTTP client yang tepat (misalnya, Axios atau Fetch API) dan menangani error dengan baik. Selalu sertakan JWT di header Authorization saat mengakses route terproteksi.

Meningkatkan Keamanan API Laravel dengan Lebih Lanjut

Selain menggunakan JWT, ada beberapa langkah lain yang dapat Anda lakukan untuk meningkatkan keamanan API Laravel Anda:

  • Validasi Input: Validasi semua input yang diterima dari klien untuk mencegah SQL injection, XSS, dan serangan lainnya. Laravel menyediakan fitur validasi yang sangat baik.
  • Rate Limiting: Batasi jumlah request yang dapat dilakukan oleh klien dalam jangka waktu tertentu untuk mencegah serangan DDoS. Laravel menyediakan middleware throttle untuk menerapkan rate limiting.
  • HTTPS: Pastikan API Anda berjalan di atas HTTPS untuk mengenkripsi komunikasi antara klien dan server.
  • CORS: Konfigurasi CORS (Cross-Origin Resource Sharing) untuk membatasi domain mana yang dapat mengakses API Anda.
  • Sanitasi Output: Sanitasi output yang dikirim ke klien untuk mencegah XSS.
  • Pemantauan Keamanan: Pantau log API Anda secara teratur untuk mendeteksi aktivitas mencurigakan.

Kesimpulan: API Laravel yang Aman dan Mudah Diintegrasikan

Dengan menggunakan Laravel dan JWT, Anda dapat membuat API yang aman, mudah diintegrasikan, dan scalable. Laravel menyediakan banyak fitur yang memudahkan pengembangan API, sementara JWT memberikan autentikasi yang kuat dan fleksibel. Dengan mengikuti panduan ini, Anda dapat membangun API yang handal dan aman untuk aplikasi web dan mobile Anda. Ingatlah untuk selalu memprioritaskan keamanan dan mengikuti praktik terbaik dalam pengembangan API. Selamat mencoba cara membuat API dengan Laravel dan JWT!

Tags: APIAuthenticationData IntegrationJSON Web TokenJWTLaravelPHPRESTful APISecuritytutorial
Jasper

Jasper

Related Posts

API

Membuat API Authentication dengan Laravel Sanctum: Panduan Lengkap

by Jasper
June 26, 2025
Hacker

Cara Meningkatkan Keamanan Website Laravel dari Serangan Hacker

by Willow
June 26, 2025
Development

Top 5 Package Laravel yang Mempermudah Pengembangan Website Anda

by Seraphina
June 26, 2025
Next Post

Contoh Aplikasi Sederhana Menggunakan Laravel: Proyek Praktis untuk Pemula

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recommended

Desain Website Modern dan Menarik: Tingkatkan Konversi dengan Visual yang Memukau

April 9, 2025

Lowongan Kerja Web Development Fresh Graduate: Tips Mendapatkan Pekerjaan Impian

June 9, 2025

Tutorial Laravel Dasar untuk Pemula Bahasa Indonesia: Mulai Membangun Aplikasi Web

June 9, 2025

Generator AI untuk Membuat Logo Website dengan Mudah

June 27, 2025

Tools AI Gratis untuk Meningkatkan Produktivitas Konten Marketing Anda

June 27, 2025

Cara Membuat Artikel SEO-Friendly dengan Bantuan AI

June 26, 2025

Aplikasi AI Terbaik untuk Mengedit Foto Produk Online: Tingkatkan Penjualanmu Sekarang!

June 26, 2025

m.techreview.click

Our media platform offers reliable news and insightful articles. Stay informed with our comprehensive coverage and in-depth analysis on various topics.
Read more »

Recent Posts

  • Generator AI untuk Membuat Logo Website dengan Mudah
  • Tools AI Gratis untuk Meningkatkan Produktivitas Konten Marketing Anda
  • Cara Membuat Artikel SEO-Friendly dengan Bantuan AI

Categories

  • 2024
  • Agency
  • AI
  • Akses
  • Aktif
  • Akuntansi
  • Algoritma
  • Analisis
  • Anggaran
  • Antarmuka
  • Antisipasi
  • API
  • Aplikasi
  • Artikel
  • Asynchronous
  • Audio
  • Authentication
  • Authorization
  • Backend
  • Background
  • Backup
  • Bahasa
  • Bandwidth
  • Bantuan
  • Belajar
  • Bergabung
  • Biaya
  • Bisnis
  • Blogger
  • Bootstrap
  • Branding
  • Bukti
  • Cepat
  • Chatbot
  • Cloud
  • Coding
  • Company
  • Contoh
  • cPanel
  • CRM
  • CSS
  • Custom
  • Dampak
  • Dasar
  • Data
  • Database
  • Deployment
  • Desain
  • Design
  • Detail
  • Developer
  • Development
  • Digital
  • Diskusi
  • Dokumentasi
  • Domain
  • Download
  • Dukungan
  • E-commerce
  • Efektif
  • Efisiensi
  • Eloquent
  • Email
  • Engine
  • Enterprise
  • Error
  • Error generating categories
  • Estimasi
  • Etika
  • Event
  • Faktor
  • Fitur
  • Fleksibel
  • Fortify
  • Foto
  • Framework
  • Freelancer
  • Fresh
  • Frontend
  • Fungsi
  • Gambar
  • Garansi
  • Gratis
  • Hacker
  • Harga
  • Hemat
  • Here are 5 categories derived from the article title "Hosting dengan Dukungan Pelanggan 24 Jam: Bantuan Kapanpun Dibutuhkan": Hosting
  • Here are 5 categories derived from the article title "Hosting Domain Murah Indonesia dengan Proteksi DDoS Gratis: Solusi Terbaik untuk Website Anda": Hosting
  • Here are 5 categories derived from the provided list and the article titles: Company
  • Hosting
  • HTML
  • Hybrid
  • Implementasi
  • Indonesia
  • Inovasi
  • Inspirasi
  • Instalasi
  • Integrasi
  • Investasi
  • Jakarta
  • Jasa
  • JavaScript
  • Kantor
  • Kapasitas
  • Karir
  • Karyawan
  • Keamanan
  • Keandalan
  • Kebutuhan
  • Kecepatan
  • Kecil
  • Kehidupan
  • Kemampuan
  • Kemudahan
  • Kerja
  • Kesalahan
  • Kesehatan
  • Keterampilan
  • Keuntungan
  • Keyword
  • Kode
  • Kompetensi
  • Komponen
  • Komunikasi
  • Komunitas
  • Konsep
  • Konten
  • Konversi
  • Kreativitas
  • Kredibilitas
  • Kualitas
  • Langkah
  • Laravel
  • Latihan
  • Layanan
  • Library
  • Listener
  • Livewire
  • Logika
  • Logo
  • Lokal
  • Loyalitas
  • Machine Learning
  • Mahasiswa
  • Mahir
  • Maintenance
  • Manfaat
  • Manufaktur
  • Marketing
  • Masa Depan
  • Masyarakat
  • Medis
  • Memilih
  • Meningkatkan
  • Middleware
  • Migration
  • Mobile
  • Modern
  • Murah
  • MySQL
  • Observer
  • Online
  • Operasional
  • Optimasi
  • ORM
  • Otentikasi
  • Otomatis
  • Package
  • Panduan
  • Pasar
  • Pekerjaan
  • Pelajaran
  • Pelanggan
  • Pelatihan
  • Peluang
  • Pemahaman
  • Pemanfaatan
  • Pemasaran
  • Pemilihan
  • Pemrograman
  • Pemula
  • Penawaran
  • Pengalaman
  • Pengenalan
  • Pengguna
  • Penggunaan
  • Pengujian
  • Penipuan
  • Penjualan
  • Penulisan
  • Peran
  • Perbandingan
  • Perbedaan
  • Performa
  • Performance
  • Peringkat
  • Pertimbangan
  • Pertumbuhan
  • Perusahaan
  • PHP
  • Pilihan
  • Platform
  • Policy
  • Portofolio
  • Praktik
  • Prediksi
  • Pribadi
  • Process
  • Produktivitas
  • Profesional
  • Profil
  • Profile
  • Project
  • Proyek
  • Python
  • Queue
  • Real-Time
  • Redis
  • Referensi
  • Rekomendasi
  • Relasi
  • Remote
  • Request
  • Responsive
  • Retail
  • Retensi
  • Review
  • Riset
  • Ritel
  • Roadmap
  • Saham
  • Sanctum
  • Sederhana
  • Seeding
  • SEO
  • Sertifikat
  • Server
  • Sharing
  • Sinkronisasi
  • Sistem
  • Skalabilitas
  • Skill
  • Software
  • Solusi
  • Space
  • SSL
  • Startup
  • Strategi
  • Struktur
  • Studi Kasus
  • Sukses
  • Tanggung Jawab
  • Tantangan
  • Teknis
  • Teknologi
  • Teks
  • Template
  • Tenaga Kerja
  • Terbaik
  • Terjangkau
  • Terjemahan
  • Terlengkap
  • Terpercaya
  • Tim
  • Tips
  • Toko
  • Tools
  • Training
  • Transkripsi
  • Tren
  • Tugas
  • Tutorial
  • Uji Coba
  • UMKM
  • Umum
  • Unlimited
  • Uptime
  • URL
  • User Experience
  • Video
  • Visual
  • VPS
  • Wajah
  • Web
  • Web Development
  • Website
  • Windows
  • WordPress

Resource

  • About us
  • Contact Us
  • Privacy Policy

© 2024 m.techreview.click.

No Result
View All Result
  • Website
  • Indonesia
  • Laravel
  • Hosting
  • AI
  • Development

© 2024 m.techreview.click.