Rumah pembangunan bahagian belakang tutorial php Melaksanakan & menguji pengesahan Socialite dalam Laravel

Melaksanakan & menguji pengesahan Socialite dalam Laravel

Jan 03, 2025 am 11:17 AM

Implementing & testing Socialite authentication in 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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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                                                          │
 └──────────────────────────────────────────────────────────────┘
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Tukar ke dalam direktori projek dan pasang Socialite.

laravel new socialite-tests
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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                                                          │
 └──────────────────────────────────────────────────────────────┘
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Letakkan kod berikut dalam fail migrasi yang baru dibuat dalam pangkalan data/migrasi:

cd socialite-tests
composer require laravel/socialite
Salin selepas log masuk

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
Salin selepas log masuk

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();
        });
    }
};
Salin selepas log masuk

Tambah yang berikut pada .env, menggunakan bukti kelayakan daripada apl Google anda yang anda buat dalam bahagian "prasyarat".

php artisan migrate
Salin selepas log masuk

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',
],
Salin selepas log masuk

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"
Salin selepas log masuk

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('/');
});
Salin selepas log masuk

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>
Salin selepas log masuk

Gantikan kandungan ujian/Feature/AuthRoutesTest.php yang baru dibuat dengan yang berikut.

php artisan serve
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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                                                          │
 └──────────────────────────────────────────────────────────────┘
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

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

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

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,

Bagaimanakah sesi merampas kerja dan bagaimana anda dapat mengurangkannya dalam PHP? Bagaimanakah sesi merampas kerja dan bagaimana anda dapat mengurangkannya dalam PHP? Apr 06, 2025 am 12:02 AM

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.

Apakah penghitungan (enums) dalam Php 8.1? Apakah penghitungan (enums) dalam Php 8.1? Apr 03, 2025 am 12:05 AM

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.

Huraikan prinsip -prinsip yang kukuh dan bagaimana ia memohon kepada pembangunan PHP. Huraikan prinsip -prinsip yang kukuh dan bagaimana ia memohon kepada pembangunan PHP. Apr 03, 2025 am 12:04 AM

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? Bagaimana cara debug mod CLI dalam phpstorm? Apr 01, 2025 pm 02:57 PM

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

Bagaimana cara menghantar permintaan pos yang mengandungi data JSON menggunakan perpustakaan php curl? Bagaimana cara menghantar permintaan pos yang mengandungi data JSON menggunakan perpustakaan php curl? Apr 01, 2025 pm 03:12 PM

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 ...

Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

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.

See all articles