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

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

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

Jan 03, 2025 am 11:17 AM

Implementing & testing Socialite authentication in Laravel

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

這篇文章將:

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

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

Laravel Socialite 做什么和不做什么?

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

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

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

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

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

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

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

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

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

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

使用 Socialite 設置一個最小的 Laravel 項目

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

laravel new socialite-tests

從安裝程序中選擇以下選項:

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

切換到項目目錄并安裝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

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

我們將密碼設置為可為空,因為如果用戶僅通過 Google 進行身份驗證,則永遠不會設置密碼。如果您的應用允許社交身份驗證密碼身份驗證,則當用戶嘗試通過密碼登錄時,您必須驗證密碼不為空或為空。

運行遷移。

php artisan make:migration add_socialite_fields_to_users

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

<?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 應用中的憑據(jù),將以下內容添加到 .env。

php artisan migrate

將routes/web.php的內容替換為以下代碼。

// config/services.php

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

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

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

最后,將 resources/views/welcome.php 的內容替換為以下標記。

# .env

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

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

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

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

用害蟲測試社交名流

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

我們可以使用以下命令創(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 的內容替換為以下內容。

php artisan serve

測試如何進行

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

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

通過 Mockery 模擬流暢的 API 非常乏味:您必須從最終調用開始并向后進行。

這是我們的回調端點調用的 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                                                          │
 └──────────────────────────────────────────────────────────────┘

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

總結

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

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

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

如何在PHP中實施身份驗證和授權? 如何在PHP中實施身份驗證和授權? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在于驗證文件類型、重命名文件并限制權限。1.使用finfo_file()檢查真實MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限制文件大小,設置目錄權限為0755;4.使用ClamAV掃描惡意軟件,增強安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

PHP中==(松散比較)和===(嚴格的比較)之間有什么區(qū)別? PHP中==(松散比較)和===(嚴格的比較)之間有什么區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在于類型檢查的嚴格程度。==在比較前會進行類型轉換,例如5=="5"返回true,而===要求值和類型都相同才會返回true,例如5==="5"返回false。使用場景上,===更安全應優(yōu)先使用,==僅在需要類型轉換時使用。

如何在PHP( - , *, /,%)中執(zhí)行算術操作? 如何在PHP( - , *, /,%)中執(zhí)行算術操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學運算的方法如下:1.加法用 號,支持整數(shù)和浮點數(shù),也可用于變量,字符串數(shù)字會自動轉換但不推薦依賴;2.減法用-號,變量同理,類型轉換同樣適用;3.乘法用*號,適用于數(shù)字及類似字符串;4.除法用/號,需避免除以零,并注意結果可能是浮點數(shù);5.取模用%號,可用于判斷奇偶數(shù),處理負數(shù)時余數(shù)符號與被除數(shù)一致。正確使用這些運算符的關鍵在于確保數(shù)據(jù)類型清晰并處理好邊界情況。

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅動(通過PECL或Composer安裝)創(chuàng)建客戶端實例并操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴展連接Redis,執(zhí)行鍵值設置與獲取,推薦phpredis用于高性能場景,Predis則便于快速部署;兩者均適用于生產(chǎn)環(huán)境且文檔完善。

我如何了解最新的PHP開發(fā)和最佳實踐? 我如何了解最新的PHP開發(fā)和最佳實踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什么是PHP,為什么它用于Web開發(fā)? 什么是PHP,為什么它用于Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設置PHP時區(qū)? 如何設置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()

See all articles