


Melaksanakan & menguji pengesahan Socialite dalam Laravel
Laravel Socialite ialah pakej Laravel pihak pertama yang membantu pembangun melaksanakan pengesahan sosial OAuth & OAuth2 dalam aplikasi mereka. Ia mempunyai sokongan terbina dalam untuk Facebook, Twitter, Google, LinkedIn, GitHub, GitLab dan Bitbucket. Socialite boleh menyokong penyedia lain melalui pakej komuniti.
Siaran ini akan:
- Terangkan apa yang Socialite lakukan dan tidak lakukan.
- Tunjukkan cara untuk menyepadukan pengesahan Google ke dalam projek Laravel baharu melalui Socialite.
- Tunjukkan contoh ujian Socialite.
TLDR: anda boleh melihat projek yang telah siap di GitHub saya. Sila lihat jika anda lebih suka membaca kod yang telah lengkap.
Apakah yang Laravel Socialite lakukan dan tidak lakukan?
Socialite ialah pakej kecil, dengan API utamanya terdiri daripada dua kaedah utama:
- Socialite::driver($authProvider)->redirect() akan mengubah hala pengguna ke penyedia pengesahan yang ditentukan, menghantar sebarang maklumat yang diperlukan kepada pembekal melalui parameter URL.
- Socialite::driver($authProvider)->user() mendapatkan semula data pengguna yang dihantar semula daripada pembekal pengesahan dan menjadikannya tersedia ke titik akhir.
Terdapat kaedah sokongan tambahan untuk skop tetapan dan parameter pilihan. Anda boleh membaca tentang mereka dalam dokumentasi Sosialit.
Socialite tidak melakukan perkara berikut: ia menyerahkan pelaksanaan ciri ini kepada pembangun:
- ❌ Cipta jadual atau lajur pangkalan data yang diperlukan untuk menyimpan data pengesahan sosial.
- ❌ Cipta pengguna yang tidak wujud semasa proses pengesahan.
- ❌ Sahkan pengguna selepas aliran OAuth berjaya.
- ❌ Muat semula token OAuth.
Prasyarat: mencipta projek Google Cloud
Kami akan menyediakan projek Socialite kecil yang membolehkan pengguna membuat pengesahan melalui Google. Untuk berbuat demikian, anda mesti membuat apl Google.
Mula-mula buat projek Google Cloud baharu, kemudian konfigurasikan skrin persetujuan OAuth untuk projek itu. Tetapkan jenis pengguna kepada luaran, kemudian dayakan skop berikut:
- .../auth/userinfo.email
- .../auth/userinfo.profile
Selepas mengkonfigurasi skrin persetujuan, buat ID Klien OAuth 2.0 dengan melawati Halaman Bukti Kelayakan Awan Google. Pegang pada ID pelanggan dan rahsia pelanggan: kami akan menggunakannya kemudian dalam projek.
Menyediakan projek Laravel yang minimum dengan Socialite
Buat projek Laravel baharu:
laravel new socialite-tests
Pilih pilihan berikut daripada pemasang:
┌ Would you like to install a starter kit? ────────────────────┐ │ No starter kit │ └──────────────────────────────────────────────────────────────┘ ┌ Which testing framework do you prefer? ──────────────────────┐ │ Pest │ └──────────────────────────────────────────────────────────────┘ ┌ Which database will your application use? ───────────────────┐ │ SQLite │ └──────────────────────────────────────────────────────────────┘ ┌ Would you like to run the default database migrations? ──────┐ │ Yes │ └──────────────────────────────────────────────────────────────┘
Tukar ke dalam direktori projek dan pasang Socialite.
laravel new socialite-tests
Buat penghijrahan baharu.
┌ Would you like to install a starter kit? ────────────────────┐ │ No starter kit │ └──────────────────────────────────────────────────────────────┘ ┌ Which testing framework do you prefer? ──────────────────────┐ │ Pest │ └──────────────────────────────────────────────────────────────┘ ┌ Which database will your application use? ───────────────────┐ │ SQLite │ └──────────────────────────────────────────────────────────────┘ ┌ Would you like to run the default database migrations? ──────┐ │ Yes │ └──────────────────────────────────────────────────────────────┘
Letakkan kod berikut dalam fail migrasi yang baru dibuat dalam pangkalan data/migrasi:
cd socialite-tests composer require laravel/socialite
Penghijrahan ini menambah medan yang akan disediakan oleh Socialite apabila pengguna berjaya mengesahkan. Dalam pelaksanaan kami, kami menambah medan ini terus ke jadual pengguna untuk kesederhanaan. Jika anda ingin menyokong lebih banyak penyedia berbanding Google, anda mungkin mahu membuat jadual berasingan yang boleh menyimpan berbilang penyedia bagi setiap pengguna.
Kami menetapkan kata laluan menjadi batal kerana pengguna tidak akan menetapkan kata laluan jika mereka hanya mengesahkan melalui Google. Jika apl anda membenarkan pengesahan sosial dan pengesahan kata laluan, anda mesti mengesahkan bahawa kata laluan itu tidak kosong atau batal apabila pengguna cuba log masuk melalui kata laluan.
Jalankan penghijrahan.
php artisan make:migration add_socialite_fields_to_users
Dalam config/services.php, tambahkan blok kod berikut pada penghujung tatasusunan perkhidmatan. Anda boleh menemui senarai penuh nama perkhidmatan Socialite yang sah dalam dokumen konfigurasi.
<?php // database/migrations/2024_12_31_075619_add_socialite_fields_to_users.php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::table('users', function (Blueprint $table) { $table->string('google_id')->default(''); $table->string('google_token')->default(''); $table->string('google_refresh_token')->default(''); // If your app allows both password and social logins, you // MUST validate that the password is not blank during login. // If you do not, an attacker could gain access to an account // that uses social login by only knowing the email. $table->string('password')->nullable()->change(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('google_id'); $table->dropColumn('google_token'); $table->dropColumn('google_refresh_token'); $table->string('password')->nullable(false)->change(); }); } };
Tambah yang berikut pada .env, menggunakan bukti kelayakan daripada apl Google anda yang anda buat dalam bahagian "prasyarat".
php artisan migrate
Ganti kandungan route/web.php dengan kod berikut.
// config/services.php 'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => '/auth/google/callback', ],
Kod baharu dalam fail ini melaksanakan laluan untuk:
- Mengubah hala ke Google untuk log masuk sosial dengan maklumat yang sesuai.
- Mengendalikan panggilan balik daripada Google. Laluan ini mencipta atau mengemas kini pengguna semasa log masuk, kemudian mengesahkan mereka dan mengubah hala mereka ke halaman utama.
- Melog keluar pengguna yang disahkan.
Akhir sekali, gantikan kandungan sumber/pandangan/welcome.php dengan penanda berikut.
# .env GOOGLE_CLIENT_ID="your-google-client-id" GOOGLE_CLIENT_SECRET="your-google-client-secret"
Dengan ini selesai, kami boleh menguji apl secara manual dengan menjalankan pelayan pembangunan.
<?php // routes/web.php use App\Models\User; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Route; use Laravel\Socialite\Facades\Socialite; use Laravel\Socialite\Two\InvalidStateException; use Laravel\Socialite\Two\User as OAuth2User; Route::get('/', function () { return view('welcome'); }); Route::get('/auth/google/redirect', function () { return Socialite::driver('google')->redirect(); }); Route::get('/auth/google/callback', function () { try { /** @var OAuth2User $google_user */ $google_user = Socialite::driver('google')->user(); } catch (InvalidStateException $exception) { abort(400, $exception->getMessage()); } $user = User::updateOrCreate([ 'email' => $google_user->email, ], [ 'google_id' => $google_user->id, 'name' => $google_user->name, 'google_token' => $google_user->token, 'google_refresh_token' => $google_user->refreshToken, ]); Auth::login($user); return redirect('/'); }); Route::get('/auth/logout', function () { Auth::logout(); return redirect('/'); });
Apabila anda mengklik pautan Log masuk dengan Google, anda harus melalui aliran OAuth2 dan diubah hala ke halaman utama di mana anda boleh melihat maklumat tentang pengguna yang baru dibuat daripada Google.
Menguji Sosialit dengan Perosak
Ujian manual kami berfungsi, tetapi kami ingin ujian automatik untuk mengesahkan bahawa kami tidak melanggar fungsi ini secara tidak sengaja pada masa hadapan.
Kami boleh mencipta fail ujian baharu dengan arahan berikut.
<!-- resources/views/welcome.php --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Laravel Socialite Testing Example</title> </head> <body> <h1>Laravel Socialite Testing Example</h1> @if (auth()->check()) <p>User is authenticated.</p> <p>Name: {{ auth()->user()->name }}</p> <p>Email: {{ auth()->user()->email }}</p> <p><a href="/auth/logout">Logout</a></p> @else <p>User is not authenticated.</p> <p> <a href="/auth/google/redirect">Login with Google</a> </p> @endif </body> </html>
Gantikan kandungan ujian/Feature/AuthRoutesTest.php yang baru dibuat dengan yang berikut.
php artisan serve
Bagaimana ujian berfungsi
Apabila menguji laluan ubah hala, kami menguji bahawa Socialite mengubah hala ke URL yang betul dan melepasi parameter URL yang betul.
Apabila menguji laluan panggil balik, kami mengejek Socialite. Mengejek bukanlah pilihan kegemaran saya: dalam dunia yang ideal, kami boleh menukar Socialite untuk pelaksanaan OAuth2 yang lain dan ujian kami akan tetap berfungsi. Walau bagaimanapun, tiada cara lurus ke hadapan untuk menyambung permintaan geran kebenaran yang Socialite hantar untuk menghiasi token akses. Oleh sebab itu, mengejek adalah pendekatan paling praktikal untuk menguji Socialite.
API Fasih membosankan untuk dipermainkan melalui Olok-olok: anda mesti bermula dari panggilan akhir dan berjalan ke belakang.
Berikut ialah kaedah Socialite yang digunakan oleh titik akhir panggilan balik kami.
laravel new socialite-tests
Berikut ialah cara ia mesti diejek melalui Olok-olok:
┌ Would you like to install a starter kit? ────────────────────┐ │ No starter kit │ └──────────────────────────────────────────────────────────────┘ ┌ Which testing framework do you prefer? ──────────────────────┐ │ Pest │ └──────────────────────────────────────────────────────────────┘ ┌ Which database will your application use? ───────────────────┐ │ SQLite │ └──────────────────────────────────────────────────────────────┘ ┌ Would you like to run the default database migrations? ──────┐ │ Yes │ └──────────────────────────────────────────────────────────────┘
Akhir sekali, kami mempunyai ujian untuk memastikan bahawa menavigasi terus ke URL panggil balik di luar aliran OAuth mengembalikan kod status 400. Kami melengkapkan panggilan ke Socialite::driver('google')->user() dalam titik akhir panggil balik dalam blok try/catch. Jika kami tidak membungkus panggilan Socialite dalam blok try/catch dan seseorang menaip URL panggil balik ke dalam penyemak imbas mereka, titik akhir akan mengeluarkan pengecualian dengan kod status HTTP 500. Jika pasukan anda telah menyediakan pemantauan untuk 500 kod status, itu boleh menyebabkan seseorang mendapat halaman di tengah malam.
Membungkus
Ini ialah penyepaduan yang minimum, dan terdapat banyak lagi yang boleh dilaksanakan. Jika kami melaksanakan penyepaduan dengan penyedia sosial di mana e-mel pengguna boleh berubah, pelaksanaan ini tidak akan berfungsi kerana ia sepadan dengan alamat e-mel. Jika pengguna boleh menukar alamat e-mel mereka dalam apl kami, pelaksanaan ini juga tidak akan berfungsi atas sebab yang sama. Walau bagaimanapun, kini anda telah melihat cara untuk menguji Socialite, anda boleh menulis ujian untuk senario ini dan mengubah suai pelaksanaan asas supaya ia lulus.
Saya membaca banyak artikel blog dan siaran forum tentang Socialite sebelum saya memahami cara membina pelaksanaan saya sendiri, cara mengujinya dan perkara yang harus saya fikirkan. Saya ingin mengiktiraf sebahagian daripada mereka di sini.
- Cara saya menulis ujian penyepaduan untuk apl dikuasakan Laravel Socialite oleh Stefan Zweifel
- Forum ServerSideUp: Amalan Terbaik Sosialit, perbualan
- Limpahan Tindanan: Cara Menguji Laravel Socialite
- Stack Exchange: Untuk Memaut atau Tidak Memautkan Log Masuk Sosial dengan E-mel Padanan
- Stack Exchange: Berurusan dengan Akaun Sosial Terhubung dan Bakal Anak Yatim
Baca mereka jika anda berminat untuk menggali lebih dalam. Selain itu, beritahu saya jika anda berminat dengan bahagian 2 siaran ini di mana saya membincangkan pengendalian berbilang penyedia sosial, mengendalikan apabila pengguna menukar alamat e-mel mereka atau mengendalikan token muat semula.
Atas ialah kandungan terperinci Melaksanakan & menguji pengesahan Socialite dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Alipay Php ...

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Sesi rampasan boleh dicapai melalui langkah -langkah berikut: 1. Dapatkan ID Sesi, 2. Gunakan ID Sesi, 3. Simpan sesi aktif. Kaedah untuk mengelakkan rampasan sesi dalam PHP termasuk: 1. Gunakan fungsi Sesi_Regenerate_ID () untuk menjana semula ID Sesi, 2. Data sesi stor melalui pangkalan data, 3.

Fungsi penghitungan dalam Php8.1 meningkatkan kejelasan dan jenis keselamatan kod dengan menentukan pemalar yang dinamakan. 1) Penghitungan boleh menjadi bilangan bulat, rentetan atau objek, meningkatkan kebolehbacaan kod dan keselamatan jenis. 2) Penghitungan adalah berdasarkan kelas dan menyokong ciri-ciri berorientasikan objek seperti traversal dan refleksi. 3) Penghitungan boleh digunakan untuk perbandingan dan tugasan untuk memastikan keselamatan jenis. 4) Penghitungan menyokong penambahan kaedah untuk melaksanakan logik kompleks. 5) Pemeriksaan jenis dan pengendalian ralat yang ketat boleh mengelakkan kesilapan biasa. 6) Penghitungan mengurangkan nilai sihir dan meningkatkan keupayaan, tetapi memberi perhatian kepada pengoptimuman prestasi.

Penerapan prinsip pepejal dalam pembangunan PHP termasuk: 1. Prinsip Tanggungjawab Tunggal (SRP): Setiap kelas bertanggungjawab untuk hanya satu fungsi. 2. Prinsip Terbuka dan Tutup (OCP): Perubahan dicapai melalui lanjutan dan bukannya pengubahsuaian. 3. Prinsip Penggantian Lisch (LSP): Subkelas boleh menggantikan kelas asas tanpa menjejaskan ketepatan program. 4. Prinsip Pengasingan Antara Muka (ISP): Gunakan antara muka halus untuk mengelakkan kebergantungan dan kaedah yang tidak digunakan. 5. Prinsip Inversi Ketergantungan (DIP): Modul peringkat tinggi dan rendah bergantung kepada abstraksi dan dilaksanakan melalui suntikan ketergantungan.

Bagaimana cara debug mod CLI dalam phpstorm? Semasa membangun dengan PHPStorm, kadang -kadang kita perlu debug PHP dalam mod Interface Line Command (CLI) ...

Menghantar data JSON menggunakan perpustakaan Curl PHP dalam pembangunan PHP, sering kali perlu berinteraksi dengan API luaran. Salah satu cara biasa ialah menggunakan perpustakaan curl untuk menghantar post ...

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.
