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

首頁 後端開發(fā) php教程 在 Laravel 中實作和測試社交名流身份驗證

在 Laravel 中實作和測試社交名流身份驗證

Jan 03, 2025 am 11:17 AM

Implementing & testing Socialite authentication in Laravel

Laravel Socialite 是一個第一方 Laravel 包,可幫助開發(fā)人員在其應用程式中實現(xiàn) OAuth 和 OAuth2 社交身份驗證。它內(nèi)建了對 Facebook、Twitter、Google、LinkedIn、GitHub、GitLab 和 Bitbucket 的支援。社交名流可以透過社群包支援其他提供者。

這篇文章將:

  • 解釋社交名流做什麼、不做什麼。
  • 展示如何透過 Socialite 將 Google 驗證整合到新的 Laravel 專案中。
  • 展示測試社交名流的範例。

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

Laravel Socialite 做什麼、不做什麼?

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

  • Socialite::driver($authProvider)->redirect() 將把使用者重新導向到指定的驗證提供者,透過 URL 參數(shù)將任何必要的資訊傳遞給提供者。
  • Socialite::driver($authProvider)->user() 擷取從驗證提供者傳回的使用者資料並提供給端點。

還有針對設定範圍和可選參數(shù)的附加支援方法。您可以在社交名流文件中閱讀有關它們的資訊。

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

  • ? 建立儲存社交驗證資料所需的資料庫表或欄位。
  • ? 建立身份驗證過程中不存在的使用者。
  • ? 在 OAuth 流程成功後對使用者進行身份驗證。
  • ? 刷新 OAuth 令牌。

先決條件:建立 Google Cloud 項目

我們將建立一個小型社交項目,允許使用者透過 Google 進行身份驗證。為此,您必須建立 Google 應用程式。

先建立一個新的 Google Cloud 項目,然後為該項目配置 OAuth 同意畫面。將使用者類型設定為外部,然後啟用以下範圍:

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

設定同意畫面後,透過造訪 Google Cloud 憑證頁面建立 OAuth 2.0 用戶端 ID。保留客戶端ID客戶端密鑰:我們稍後將在專案中使用它們。

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

建立一個新的 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

建立新的遷移。

 ┌ 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中新建立的遷移檔案中:

cd socialite-tests
composer require laravel/socialite

此遷移新增了當使用者成功進行身份驗證時由社交名流提供的欄位。在我們的實作中,為了簡單起見,我們將這些欄位直接新增到使用者表中。如果您想支援比 Google 更多的供應商,您可能需要建立一個單獨的表格來儲存每個使用者的多個提供者。

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

運行遷移。

php artisan make:migration add_socialite_fields_to_users

在 config/services.php 中,將以下程式碼區(qū)塊新增至 services 陣列的末端。您可以在設定文件中找到有效社交名流服務名稱的完整清單。

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

使用您在「先決條件」部分中建立的 Google 應用程式中的憑證,將以下內(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',
],

此文件中的新程式碼實作了以下路由:

  • 重定向到 Google 以使用適當?shù)馁Y訊進行社交登入。
  • 處理來自 Google 的回呼。此路由在登入時建立或更新用戶,然後對他們進行身份驗證,並將他們重定向到主頁。
  • 註銷經(jīng)過驗證的使用者。

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

# .env

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

完成後,我們可以透過執(zhí)行開發(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 的新建立使用者的信息。

用害蟲測試社交名流

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

我們可以使用以下命令建立一個新的測試檔案。

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

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

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 區(qū)塊內(nèi)的回呼端點中。如果我們沒有將 Socialite 呼叫包裝在 try/catch 區(qū)塊中,並且有人在瀏覽器中輸入了回調 URL,則端點將引發(fā)帶有 HTTP 500 狀態(tài)碼的異常。如果您的團隊設定了 500 個狀態(tài)代碼的監(jiān)控,則可能會導致某人在半夜收到尋呼。

總結

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

在我了解如何建立自己的實作、如何測試它以及我應該考慮什麼之前,我閱讀了很多有關 Socialite 的部落格文章和論壇貼文。我想對其中的一些人表示感謝。

  • 我如何為 Laravel Socialite 支援的應用程式編寫整合測試,作者:Stefan Zweifel
  • ServerSideUp 論壇:社群名流最佳實踐,對話
  • Stack Overflow:如何測試 Laravel Socialite
  • Stack Exchange:連結或不連結社交登入與符合的電子郵件
  • Stack Exchange:處理關聯(lián)的社交帳戶和潛在的孤兒

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

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

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內(nèi)容,請聯(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