国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 后端開發(fā) php教程 在 Laravel 中實(shí)現(xiàn)和測試社交名流身份驗(yàn)證

在 Laravel 中實(shí)現(xiàn)和測試社交名流身份驗(yàn)證

Jan 03, 2025 am 11:17 AM

Implementing & testing Socialite authentication in Laravel

Laravel Socialite 是一個第一方 Laravel 包,可幫助開發(fā)人員在其應(yīng)用程序中實(shí)現(xiàn) OAuth 和 OAuth2 社交身份驗(yàn)證。它內(nèi)置了對 Facebook、Twitter、Google、LinkedIn、GitHub、GitLab 和 Bitbucket 的支持。社交名流可以通過社區(qū)包支持其他提供商。

這篇文章將:

  • 解釋社交名流做什么和不做什么。
  • 展示如何通過 Socialite 將 Google 身份驗(yàn)證集成到新的 Laravel 項(xiàng)目中。
  • 展示測試社交名流的示例。

TLDR:您可以在我的 GitHub 上查看已完成的項(xiàng)目。如果您只想閱讀完整的代碼,請看一下它。

Laravel Socialite 做什么和不做什么?

Socialite 是一個小包,其主要 API 主要由兩個主要方法組成:

  • Socialite::driver($authProvider)->redirect() 將把用戶重定向到指定的身份驗(yàn)證提供者,通過 URL 參數(shù)將任何必要的信息傳遞給提供者。
  • Socialite::driver($authProvider)->user() 檢索從身份驗(yàn)證提供者傳回的用戶數(shù)據(jù)并將其提供給端點(diǎn)。

還有針對設(shè)置范圍和可選參數(shù)的附加支持方法。您可以在社交名流文檔中閱讀有關(guān)它們的信息。

社交名流不會執(zhí)行以下操作:它將這些功能的實(shí)現(xiàn)留給開發(fā)人員:

  • ? 創(chuàng)建存儲社交身份驗(yàn)證數(shù)據(jù)所需的數(shù)據(jù)庫表或列。
  • ? 創(chuàng)建身份驗(yàn)證過程中不存在的用戶。
  • ? 在 OAuth 流程成功后對用戶進(jìn)行身份驗(yàn)證。
  • ? 刷新 OAuth 令牌。

先決條件:創(chuàng)建 Google Cloud 項(xiàng)目

我們將建立一個小型社交項(xiàng)目,允許用戶通過 Google 進(jìn)行身份驗(yàn)證。為此,您必須創(chuàng)建一個 Google 應(yīng)用。

首先創(chuàng)建一個新的 Google Cloud 項(xiàng)目,然后為該項(xiàng)目配置 OAuth 同意屏幕。將用戶類型設(shè)置為外部,然后啟用以下范圍:

  • .../auth/userinfo.email
  • .../auth/userinfo.profile

配置同意屏幕后,通過訪問 Google Cloud 憑據(jù)頁面創(chuàng)建 OAuth 2.0 客戶端 ID。保留客戶端ID客戶端密鑰:我們稍后將在項(xiàng)目中使用它們。

使用 Socialite 設(shè)置一個最小的 Laravel 項(xiàng)目

創(chuàng)建一個新的 Laravel 項(xiàng)目:

laravel new socialite-tests

從安裝程序中選擇以下選項(xiàng):

 ┌ 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                                                          │
 └──────────────────────────────────────────────────────────────┘

切換到項(xiàng)目目錄并安裝Socialite。

laravel new socialite-tests

創(chuàng)建新的遷移。

 ┌ 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                                                          │
 └──────────────────────────────────────────────────────────────┘

將以下代碼放入database/migrations中新創(chuàng)建的遷移文件中:

cd socialite-tests
composer require laravel/socialite

此遷移添加了當(dāng)用戶成功進(jìn)行身份驗(yàn)證時由社交名流提供的字段。在我們的實(shí)現(xiàn)中,為了簡單起見,我們將這些字段直接添加到用戶表中。如果您想支持比 Google 更多的提供商,您可能需要創(chuàng)建一個單獨(dú)的表來存儲每個用戶的多個提供商。

我們將密碼設(shè)置為可為空,因?yàn)槿绻脩魞H通過 Google 進(jìn)行身份驗(yàn)證,則永遠(yuǎn)不會設(shè)置密碼。如果您的應(yīng)用允許社交身份驗(yàn)證密碼身份驗(yàn)證,則當(dāng)用戶嘗試通過密碼登錄時,您必須驗(yàn)證密碼不為空或?yàn)榭铡?/p>

運(yùn)行遷移。

php artisan make:migration add_socialite_fields_to_users

在 config/services.php 中,將以下代碼塊添加到 services 數(shù)組的末尾。您可以在配置文檔中找到有效社交名流服務(wù)名稱的完整列表。

<?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();
        });
    }
};

使用您在“先決條件”部分中創(chuàng)建的 Google 應(yīng)用中的憑據(jù),將以下內(nèi)容添加到 .env。

php artisan migrate

將routes/web.php的內(nèi)容替換為以下代碼。

// config/services.php

'google' => [
    'client_id' => env('GOOGLE_CLIENT_ID'),
    'client_secret' => env('GOOGLE_CLIENT_SECRET'),
    'redirect' => '/auth/google/callback',
],

此文件中的新代碼實(shí)現(xiàn)了以下路由:

  • 重定向到 Google 以使用適當(dāng)?shù)男畔⑦M(jìn)行社交登錄。
  • 處理來自 Google 的回調(diào)。此路由在登錄時創(chuàng)建或更新用戶,然后對他們進(jìn)行身份驗(yàn)證,并將他們重定向到主頁。
  • 注銷經(jīng)過身份驗(yàn)證的用戶。

最后,將 resources/views/welcome.php 的內(nèi)容替換為以下標(biāo)記。

# .env

GOOGLE_CLIENT_ID="your-google-client-id"
GOOGLE_CLIENT_SECRET="your-google-client-secret"

完成后,我們可以通過運(yùn)行開發(fā)服務(wù)器來手動測試應(yīng)用程序。

<?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('/');
});

當(dāng)您點(diǎn)擊使用 Google 登錄鏈接時,您應(yīng)該完成 OAuth2 流程并被重定向到主頁,您可以在其中查看有關(guān)來自 Google 的新創(chuàng)建用戶的信息。

用害蟲測試社交名流

我們的手動測試有效,但我們希望通過自動化測試來驗(yàn)證我們將來不會意外破壞此功能。

我們可以使用以下命令創(chuàng)建一個新的測試文件。

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

將新創(chuàng)建的tests/Feature/AuthRoutesTest.php 的內(nèi)容替換為以下內(nèi)容。

php artisan serve

測試如何進(jìn)行

在測試重定向路由時,我們測試Socialite是否重定向到正確的URL并傳遞正確的URL參數(shù)。

在測試回調(diào)路由時,我們模擬了 Socialite。模擬不是我最喜歡的選擇:在理想的世界中,我們可以將 Socialite 替換為另一個 OAuth2 實(shí)現(xiàn),并且我們的測試仍然有效。但是,沒有直接的方法來連接社交名流發(fā)送的授權(quán)授予請求以裝飾訪問令牌。正因?yàn)槿绱?,模擬是測試社交名流的最實(shí)用的方法。

通過 Mockery 模擬流暢的 API 非常乏味:您必須從最終調(diào)用開始并向后進(jìn)行。

這是我們的回調(diào)端點(diǎn)調(diào)用的 Socialite 方法。

laravel new socialite-tests

以下是如何通過 Mockery 來嘲笑它:

 ┌ 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                                                          │
 └──────────────────────────────────────────────────────────────┘

最后,我們進(jìn)行了一項(xiàng)測試,以確保直接導(dǎo)航到 OAuth 流程之外的回調(diào) URL 會返回 400 狀態(tài)代碼。我們將對 Socialite::driver('google')->user() 的調(diào)用包裝在 try/catch 塊內(nèi)的回調(diào)端點(diǎn)中。如果我們沒有將 Socialite 調(diào)用包裝在 try/catch 塊中,并且有人在瀏覽器中輸入了回調(diào) URL,則端點(diǎn)將引發(fā)帶有 HTTP 500 狀態(tài)代碼的異常。如果您的團(tuán)隊(duì)設(shè)置了 500 個狀態(tài)代碼的監(jiān)控,則可能會導(dǎo)致某人在半夜收到尋呼。

總結(jié)

這是一個最小的集成,還有很多可以實(shí)現(xiàn)的功能。如果我們要實(shí)現(xiàn)與社交提供商的集成,其中用戶的電子郵件可能會更改,則此實(shí)現(xiàn)將不起作用,因?yàn)樗c電子郵件地址匹配。如果用戶可以在我們的應(yīng)用程序中更改他們的電子郵件地址,那么由于同樣的原因,此實(shí)現(xiàn)也將不起作用。但是,現(xiàn)在您已經(jīng)了解了如何測試 Socialite,您可以為這些場景編寫測試并修改底層實(shí)現(xiàn),以便它們通過。

在我了解如何構(gòu)建自己的實(shí)現(xiàn)、如何測試它以及我應(yīng)該考慮什么之前,我閱讀了很多有關(guān) Socialite 的博客文章和論壇帖子。我想對其中的一些人表示感謝。

  • 我如何為 Laravel Socialite 支持的應(yīng)用程序編寫集成測試,作者:Stefan Zweifel
  • ServerSideUp 論壇:社交名流最佳實(shí)踐,對話
  • Stack Overflow:如何測試 Laravel Socialite
  • Stack Exchange:鏈接或不鏈接社交登錄與匹配的電子郵件
  • Stack Exchange:處理關(guān)聯(lián)的社交帳戶和潛在的孤兒

如果您有興趣深入挖掘,請閱讀這些內(nèi)容。另外,如果您對本文的第 2 部分感興趣,請告訴我,我將深入探討處理多個社交提供商、處理用戶更改電子郵件地址或處理刷新令牌。

以上是在 Laravel 中實(shí)現(xiàn)和測試社交名流身份驗(yàn)證的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

如何設(shè)置PHP時區(qū)? 如何設(shè)置PHP時區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什么? 編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什么? Jun 24, 2025 am 12:53 AM

寫干凈、易維護(hù)的PHP代碼關(guān)鍵在于清晰命名、遵循標(biāo)準(zhǔn)、合理結(jié)構(gòu)、善用注釋和可測試性。1.使用明確的變量、函數(shù)和類名,如$userData和calculateTotalPrice();2.遵循PSR-12標(biāo)準(zhǔn)統(tǒng)一代碼風(fēng)格;3.按職責(zé)拆分代碼結(jié)構(gòu),使用MVC或Laravel式目錄組織;4.避免面條式代碼,將邏輯拆分為單一職責(zé)的小函數(shù);5.在關(guān)鍵處添加注釋并撰寫接口文檔,明確參數(shù)、返回值和異常;6.提高可測試性,采用依賴注入、減少全局狀態(tài)和靜態(tài)方法。這些做法提升代碼質(zhì)量、協(xié)作效率和后期維護(hù)便利性。

如何使用PHP執(zhí)行SQL查詢? 如何使用PHP執(zhí)行SQL查詢? Jun 24, 2025 am 12:54 AM

Yes,youcanrunSQLqueriesusingPHP,andtheprocessinvolveschoosingadatabaseextension,connectingtothedatabase,executingqueriessafely,andclosingconnectionswhendone.Todothis,firstchoosebetweenMySQLiorPDO,withPDObeingmoreflexibleduetosupportingmultipledatabas

如何快速測試PHP代碼片段? 如何快速測試PHP代碼片段? Jun 25, 2025 am 12:58 AM

toquicklytestaphpcodesnippet,useanonlinephpsandboxlike3v4l.orgorphpize.onlineforinstantantantExecutionWithOutSetup; runco??delocalocallocallocallocallocallocallywithpplibycreatinga.phpfileandexecutingitviateringitviatheterminal;

如何在PHP中使用頁面緩存? 如何在PHP中使用頁面緩存? Jun 24, 2025 am 12:50 AM

PHP頁面緩存可通過減少服務(wù)器負(fù)載和加快頁面加載速度提升網(wǎng)站性能。1.基本文件緩存通過生成靜態(tài)HTML文件并在有效期內(nèi)提供服務(wù),避免重復(fù)生成動態(tài)內(nèi)容;2.啟用OPcache可將PHP腳本編譯為字節(jié)碼存儲在內(nèi)存中,提升執(zhí)行效率;3.對帶參數(shù)的動態(tài)頁面,應(yīng)根據(jù)URL參數(shù)分別緩存,并避免緩存用戶特定內(nèi)容;4.可使用輕量級緩存庫如PHPFastCache簡化開發(fā)并支持多種存儲驅(qū)動。結(jié)合這些方法能有效優(yōu)化PHP項(xiàng)目的緩存策略。

如何升級PHP版本? 如何升級PHP版本? Jun 27, 2025 am 02:14 AM

升級PHP版本其實(shí)不難,但關(guān)鍵在于操作步驟和注意事項(xiàng)。以下是具體方法:1.確認(rèn)當(dāng)前PHP版本及運(yùn)行環(huán)境,使用命令行或phpinfo.php文件查看;2.選擇適合的新版本并安裝,推薦8.2或8.1,Linux用戶用包管理器安裝,macOS用戶用Homebrew;3.遷移配置文件和擴(kuò)展,更新php.ini并安裝必要擴(kuò)展;4.測試網(wǎng)站是否正常運(yùn)行,檢查錯誤日志確保無兼容性問題。按照這些步驟操作,大多數(shù)情況都能順利完成升級。

在Linux上配置PHP開發(fā)環(huán)境的步驟 在Linux上配置PHP開發(fā)環(huán)境的步驟 Jun 30, 2025 am 01:57 AM

TosetupaPHPdevelopmentenvironmentonLinux,installPHPandrequiredextensions,setupawebserverlikeApacheorNginx,testwithaPHPfile,andoptionallyinstallMySQLandComposer.1.InstallPHPandextensionsviapackagemanager(e.g.,sudoaptinstallphpphp-mysqlphp-curlphp-mbst

PHP初學(xué)者指南:當(dāng)?shù)丨h(huán)境配置的詳細(xì)說明 PHP初學(xué)者指南:當(dāng)?shù)丨h(huán)境配置的詳細(xì)說明 Jun 27, 2025 am 02:09 AM

要設(shè)置PHP開發(fā)環(huán)境,需選擇合適的工具并正確安裝配置。①最基礎(chǔ)的PHP本地環(huán)境需要三個組件:Web服務(wù)器(Apache或Nginx)、PHP本身和數(shù)據(jù)庫(如MySQL/MariaDB);②推薦初學(xué)者使用集成包如XAMPP或MAMP,它們簡化了安裝流程,XAMPP適用于Windows和macOS,安裝后將項(xiàng)目文件放入htdocs目錄并通過localhost訪問;③MAMP適合Mac用戶,支持便捷切換PHP版本,但免費(fèi)版功能有限;④高級用戶可用Homebrew手動安裝,在macOS/Linux系統(tǒng)中

See all articles