Rumah >pembangunan bahagian belakang >tutorial php >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:
TLDR: anda boleh melihat projek yang telah siap di GitHub saya. Sila lihat jika anda lebih suka membaca kod yang telah lengkap.
Socialite ialah pakej kecil, dengan API utamanya terdiri daripada dua kaedah utama:
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:
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:
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.
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:
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.
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
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.
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.
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!