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

目錄
核心要點(diǎn)
創(chuàng)建應(yīng)用
數(shù)據(jù)庫設(shè)置
構(gòu)建身份驗(yàn)證
遷移
修改登錄鏈接
創(chuàng)建魔法登錄控制器、視圖和路由
首頁 后端開發(fā) php教程 讓殺死密碼!魔術(shù)登錄鏈接到救援!

讓殺死密碼!魔術(shù)登錄鏈接到救援!

Feb 10, 2025 pm 12:27 PM

告別密碼煩惱,擁抱安全便捷的無密碼登錄!本文將指導(dǎo)您如何在Laravel應(yīng)用中實(shí)現(xiàn)基于一次性鏈接的無密碼登錄系統(tǒng),提升安全性并簡化用戶體驗(yàn)。

Let's Kill the Password! Magic Login Links to the Rescue!

本文由Younes Rafie和Wern Ancheta審核。感謝所有SitePoint的同行評審員,使SitePoint的內(nèi)容達(dá)到最佳狀態(tài)!


身份驗(yàn)證技術(shù)不斷發(fā)展,從傳統(tǒng)的郵箱-密碼組合,到社交登錄,再到如今的無密碼登錄(更準(zhǔn)確地說是“僅郵箱”登錄)。無密碼登錄系統(tǒng)通過向用戶郵箱發(fā)送登錄鏈接來驗(yàn)證身份。

Let's Kill the Password! Magic Login Links to the Rescue!

無密碼登錄流程如下:

  1. 用戶訪問登錄頁面;
  2. 輸入郵箱地址并確認(rèn);
  3. 系統(tǒng)向郵箱發(fā)送登錄鏈接;
  4. 點(diǎn)擊鏈接后,用戶被重定向回應(yīng)用并登錄;
  5. 鏈接失效。

如果您忘記應(yīng)用密碼但記得注冊郵箱,此方法非常實(shí)用。Slack等應(yīng)用也采用了這種技術(shù)。本教程將演示如何在Laravel應(yīng)用中實(shí)現(xiàn)此系統(tǒng)。完整代碼請見此處。

核心要點(diǎn)

  • 摒棄密碼:采用基于一次性使用URL的“魔法登錄鏈接”,實(shí)現(xiàn)簡單安全的無密碼認(rèn)證。
  • 用戶友好的設(shè)置:利用預(yù)定義命令和少量修改,即可輕松在Laravel應(yīng)用中實(shí)現(xiàn)此系統(tǒng)。
  • 增強(qiáng)的安全性:魔法登錄鏈接消除了傳統(tǒng)密碼系統(tǒng)中常見的漏洞,例如弱密碼和網(wǎng)絡(luò)釣魚攻擊。
  • 靈活性和控制:用戶仍可以選擇使用傳統(tǒng)密碼登錄,兼顧靈活性與安全性。
  • 高效的令牌管理:系統(tǒng)自動處理令牌過期和驗(yàn)證,確保令牌被正確使用且不會長期有效。

創(chuàng)建應(yīng)用

首先,創(chuàng)建一個新的Laravel應(yīng)用。本教程使用Laravel 5.2:

composer create-project laravel/laravel passwordless-laravel 5.2.*

如果您已有包含用戶和密碼的Laravel項(xiàng)目,無需擔(dān)心,我們不會修改正常的身份驗(yàn)證流程,而是在其之上添加一層。用戶仍可以選擇使用密碼登錄。

數(shù)據(jù)庫設(shè)置

在運(yùn)行遷移之前,需要設(shè)置MySQL數(shù)據(jù)庫。

打開根目錄下的.env文件,輸入主機(jī)名、用戶名和數(shù)據(jù)庫名稱:

<code>[...]
DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE=passwordless-app
DB_USERNAME=username
DB_PASSWORD=
[...]</code>

如果您使用的是Homestead Improved box,數(shù)據(jù)庫/用戶名/密碼組合為homestead, homestead, secret。

構(gòu)建身份驗(yàn)證

Laravel 5.2版本引入了一項(xiàng)很棒的功能:只需一條命令即可添加預(yù)制身份驗(yàn)證層。讓我們執(zhí)行此操作:

composer create-project laravel/laravel passwordless-laravel 5.2.*

此命令會構(gòu)建身份驗(yàn)證所需的一切,即視圖、控制器和路由。

遷移

在database/migrations目錄中,可以看到生成的Laravel應(yīng)用包含創(chuàng)建users表和password_resets表的遷移文件。

我們不會修改任何內(nèi)容,因?yàn)槲覀內(nèi)匀幌M麘?yīng)用擁有正常的身份驗(yàn)證流程。

要創(chuàng)建表,請運(yùn)行:

<code>[...]
DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE=passwordless-app
DB_USERNAME=username
DB_PASSWORD=
[...]</code>

現(xiàn)在可以運(yùn)行應(yīng)用,用戶應(yīng)該能夠使用導(dǎo)航欄中的鏈接注冊和登錄。

修改登錄鏈接

接下來,我們將修改登錄鏈接,使其重定向到自定義登錄視圖,用戶在該視圖中將僅提交郵箱地址而無需密碼。

導(dǎo)航到resources/views/layouts/app.blade.php。在那里可以找到導(dǎo)航欄部分。將包含登錄鏈接的行(在檢查用戶是否已注銷的條件語句下方)更改為:

resources/views/layouts/app.blade.php

php artisan make:auth

當(dāng)未登錄的用戶嘗試訪問受保護(hù)的路由時,他們應(yīng)該被帶到新的自定義登錄視圖,而不是正常的登錄視圖。此行為在authenticate中間件中指定。我們需要對其進(jìn)行調(diào)整:

app/Http/Middleware/Authenticate.php

php artisan migrate

請注意,在else塊中,我們已將重定向更改為指向login/magiclink,而不是正常的login。

創(chuàng)建魔法登錄控制器、視圖和路由

下一步是在Auth文件夾中創(chuàng)建MagicLoginController:

[...]
@if (Auth::guest())
<li><a href="http://www.miracleart.cn/link/9964364bfd2b38643a0b41b981c01f60'/login/magiclink') }}">Login</a></li>
<li><a href="http://www.miracleart.cn/link/9964364bfd2b38643a0b41b981c01f60'/register') }}">Register</a></li>
[...]

然后是顯示自定義登錄頁面的路由:

app/Http/routes.php

class Authenticate
{
[...]
public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->guest()) {
        if ($request->ajax() || $request->wantsJson()) {
            return response('Unauthorized.', 401);
        } else {
            return redirect()->guest('login/magiclink');
        }
    }

    return $next($request);
}
[...]

讓我們更新MagicLoginController以包含show操作:

app/Http/Controllers/Auth/MagicLoginController.php

php artisan make:controller Auth\MagicLoginController

對于新的登錄視圖,我們將借用正常的登錄視圖,但刪除密碼字段。我們還將表單的post URL更改為指向/login/magiclink

讓我們在views/auth文件夾中創(chuàng)建一個magic文件夾來保存此新視圖:

[...]
Route::get('/login/magiclink', 'Auth\MagicLoginController@show');

讓我們將新創(chuàng)建的視圖更新為:

resources/views/auth/magic/login.blade.php

class MagicLoginController extends Controller
{
    [...]
    public function show()
    {
        return view('auth.magic.login');
    }
    [...]
}

我們將保留使用密碼登錄的選項(xiàng),因?yàn)橛脩艨赡苋匀贿x擇密碼登錄。因此,如果用戶點(diǎn)擊導(dǎo)航欄中的登錄,他們將看到如下所示的登錄視圖:

Let's Kill the Password! Magic Login Links to the Rescue!

剩余部分由于篇幅限制,無法全部展開,但基本思路如下:

  • 生成并關(guān)聯(lián)令牌: 創(chuàng)建路由和控制器方法來處理登錄表單的提交操作,驗(yàn)證郵箱地址,為用戶生成令牌,并將令牌與用戶關(guān)聯(lián)。使用 str_random() 生成隨機(jī)令牌,并將其存儲在數(shù)據(jù)庫中。
  • 發(fā)送令牌郵件:UserToken 模型中添加方法,使用 Laravel 的郵件功能發(fā)送包含登錄鏈接的郵件。鏈接應(yīng)包含令牌、郵箱地址和記住我的值。 使用 Mail::raw() 發(fā)送純文本郵件,或創(chuàng)建郵件視圖以增強(qiáng)郵件外觀。
  • 令牌驗(yàn)證和身份驗(yàn)證: 創(chuàng)建路由和控制器方法來處理登錄鏈接的點(diǎn)擊操作。使用路由模型綁定獲取令牌,驗(yàn)證令牌是否過期以及是否屬于提交的郵箱地址。使用 Carbon 庫來檢查令牌的過期時間。驗(yàn)證成功后,使用 Auth::login() 登錄用戶,并刪除已使用的令牌。

通過以上步驟,您就可以在 Laravel 應(yīng)用中實(shí)現(xiàn)一個安全可靠的無密碼登錄系統(tǒng),為用戶提供更便捷、更安全的登錄體驗(yàn)。 請記住根據(jù)您的實(shí)際需求調(diào)整令牌過期時間和其他設(shè)置。 完整的代碼和更詳細(xì)的步驟,請參考您提供的完整代碼鏈接。

以上是讓殺死密碼!魔術(shù)登錄鏈接到救援!的詳細(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)

我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 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

如何設(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()

我如何驗(yàn)證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? 我如何驗(yàn)證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? Jun 22, 2025 am 01:00 AM

TovalidateuserinputinPHP,usebuilt-invalidationfunctionslikefilter_var()andfilter_input(),applyregularexpressionsforcustomformatssuchasusernamesorphonenumbers,checkdatatypesfornumericvalueslikeageorprice,setlengthlimitsandtrimwhitespacetopreventlayout

編寫清潔和可維護(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(serialize(),Unserialize())中的數(shù)據(jù)序列化? 什么是php(serialize(),Unserialize())中的數(shù)據(jù)序列化? Jun 22, 2025 am 01:03 AM

thephpfunctionserize()andunSerialize()redustoconvertComplexdatStructDestoresToroStoroStoroSandaBackagagain.1.Serialize()

如何將PHP代碼嵌入HTML文件中? 如何將PHP代碼嵌入HTML文件中? Jun 22, 2025 am 01:00 AM

可以將PHP代碼嵌入HTML文件中,但需確保文件以.php為擴(kuò)展名,以便服務(wù)器能正確解析。使用標(biāo)準(zhǔn)的標(biāo)簽包裹PHP代碼,可在HTML中任意位置插入動態(tài)內(nèi)容。此外,可在同一文件中多次切換PHP與HTML,實(shí)現(xiàn)條件渲染等動態(tài)功能。務(wù)必注意服務(wù)器配置及語法正確性,避免因短標(biāo)簽、引號錯誤或遺漏結(jié)束標(biāo)簽導(dǎo)致問題。

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

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

See all articles