Pembangunan Laravel: Bagaimana untuk menggunakan Laravel Sanctum untuk menyediakan pengesahan API untuk SPA?
Dengan populariti Aplikasi Halaman Tunggal (SPA), kami memerlukan cara yang boleh dipercayai untuk melindungi API kami daripada akses dan serangan yang tidak dibenarkan. Laravel Sanctum ialah sistem pengesahan ringan yang disediakan oleh Laravel yang menyediakan pengesahan mudah untuk SPA. Artikel ini akan menunjukkan kepada anda cara menggunakan Laravel Sanctum untuk menyediakan pengesahan API untuk SPA anda.
Menggunakan Laravel Sanctum
Laravel Sanctum ialah pakej rasmi dalam versi Laravel 7.x untuk pengesahan API. Laravel Sanctum menggunakan token API untuk mengenal pasti pengguna dan boleh melaksanakan berbilang binaan pengesahan dengan mudah dengan menggunakan token.
Pasang Laravel Sanctum
Mula-mula, pastikan rangka kerja Laravel dipasang.
Untuk memasang laravel sanctum, anda boleh menggunakan perintah berikut
composer require laravel/sanctum
untuk menambah ServiceProvider pada senarai penyedia dalam fail config/app.php.
'providers' => [ // ... LaravelSanctumSanctumServiceProvider::class, ],
Kini anda boleh menjalankan arahan berikut untuk menerbitkan migrasi pangkalan data yang diperlukan dan konfigurasi Sanctum.
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
Laksanakan arahan berikut untuk menjalankan migrasi:
php artisan migrate
Gunakan Sanctum untuk pengesahan lalai
Sanctum mengandungi pelaksanaan lalai untuk API dan pengesahan Aplikasi Halaman Tunggal. Pengesahan lalai boleh didayakan dengan menggunakan ciri SanctumTraitsHasApiTokens untuk model pengguna.
Tambahkan ciri HasApiTokens pada model pengguna
Salin selepas log masuk
Untuk penjelasan yang lebih baik, kami akan menggunakan contoh SPA yang mudah. Andaikan bahawa URL contoh ialah http://spa.test dan API didedahkan melalui http://api.spa.test.
Mengkonfigurasi CORS dalam Laravel
Tambahkan kod berikut pada fail app/Providers/AppServiceProvider.php untuk membenarkan perkongsian sumber silang asal (CORS).
... use IlluminateSupportFacadesSchema; use IlluminateSupportFacadesURL; class AppServiceProvider extends ServiceProvider { public function boot() { Schema::defaultStringLength(191); if (config('app.env') === 'production') { URL::forceScheme('https'); } $headers = [ 'Access-Control-Allow-Origin' => '*', 'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE', 'Access-Control-Allow-Headers' => 'Origin, Content-Type, Accept, Authorization, X-Request-With', 'Access-Control-Allow-Credentials' => 'true', ]; $this->app['router']->middleware('api')->get('/sanctum/csrf-cookie', function () { return response()->json(['status' => 'success']); }); foreach ($headers as $key => $value) { config(['cors.supportsCredentials' => true]); config(['cors.paths.api/*' => [ 'allowedOrigins' => ['http://spa.test'], 'allowedHeaders' => [$key], 'allowedMethods' => ['*'], 'exposedHeaders' => [], 'maxAge' => 86400, ]]); } } }
Gantikan http://spa.test dalam kod di atas dengan URL SPA anda.
Arahan Pengesahan Token dan Perlindungan API
Dalam pengawal kita boleh menggunakan perisian tengah pengesahan Sanctum untuk menjamin laluan
public function index(Request $request) { $user = $request->user(); // ... } public function store(Request $request) { $user = $request->user(); // ... } public function destroy(Request $request, string $id) { $user = $request->user(); // ... } public function update(Request $request, string $id) { $user = $request->user(); // ... }
Ini akan diperoleh daripada pengepala permintaan Sanctum membenarkan token dan menggunakan token itu untuk mengesahkan pengguna. Jika token kebenaran tidak diberikan dalam pengepala, ralat 401 Tanpa Kebenaran akan dikembalikan.
Buat permintaan token kebenaran
Dalam SPA kami, kami boleh menggunakan perpustakaan axios untuk menggunakan API dan mendapatkan token. Untuk mendapatkan token kebenaran, kita perlu mendapatkan token CSRF terlebih dahulu, jadi kita perlu menghantar permintaan GET untuk mendapatkannya.
axios.get('http://api.spa.test/sanctum/csrf-cookie').then(response => { axios.post('http://api.spa.test/login', { username: this.username, password: this.password }).then(response => { axios.defaults.headers.common['Authorization'] = `Bearer ${response.data.token}`; this.$router.push({ name: 'home' }); }); });
Kod di atas akan membuat permintaan POST dalam http://api.spa.test, mencipta token kebenaran Sanctum baharu pada pelayan dan membalas dengan token sebagai response.data.token . Selepas itu, kita boleh menambah token pada pengepala biasa axios untuk menggunakannya dalam SPA untuk semua permintaan seterusnya.
Perhatikan bahawa contoh ini menganggap terdapat laluan bernama "log masuk".
Sanctum juga memberikan kami laluan log keluar untuk membatalkan token kebenaran.
axios.post('http://api.spa.test/logout').then(response => { delete axios.defaults.headers.common['Authorization']; this.$router.push({ name: 'login' }); });
Kesimpulan
Laravel Sanctum ialah sistem pengesahan yang ringan, ringkas dan praktikal. Ia mudah untuk disepadukan dan digunakan, serta menyediakan fungsi pengesahan lalai. Sebaik sahaja anda menggunakan Sanctum, anda tidak perlu lagi menulis sistem pengesahan anda sendiri. Ia membolehkan kami melaksanakan pengesahan selamat untuk API kami dengan cepat dan membolehkan SPA kami berinteraksi dengan API dalam sebahagian kecil masa.
Atas ialah kandungan terperinci Pembangunan Laravel: Bagaimana untuk menyediakan pengesahan API untuk SPA menggunakan Laravel Sanctum?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!