搜尋
首頁後端開發php教程讓殺死密碼!魔術登錄鏈接到救援!

告別密碼煩惱,擁抱安全便捷的無密碼登錄!本文將指導您如何在Laravel應用中實現基於一次性鏈接的無密碼登錄系統,提升安全性並簡化用戶體驗。

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

本文由Younes Rafie和Wern Ancheta審核。感謝所有SitePoint的同行評審員,使SitePoint的內容達到最佳狀態!


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

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

無密碼登錄流程如下:

  1. 用戶訪問登錄頁面;
  2. 輸入郵箱地址並確認;
  3. 系統向郵箱發送登錄鏈接;
  4. 點擊鏈接後,用戶被重定向回應用並登錄;
  5. 鏈接失效。

如果您忘記應用密碼但記得註冊郵箱,此方法非常實用。 Slack等應用也採用了這種技術。本教程將演示如何在Laravel應用中實現此系統。完整代碼請見此處。

核心要點

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

創建應用

首先,創建一個新的Laravel應用。本教程使用Laravel 5.2:

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

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

數據庫設置

在運行遷移之前,需要設置MySQL數據庫。

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

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

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

構建身份驗證

Laravel 5.2版本引入了一項很棒的功能:只需一條命令即可添加預製身份驗證層。讓我們執行此操作:

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

此命令會構建身份驗證所需的一切,即視圖、控制器和路由。

遷移

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

我們不會修改任何內容,因為我們仍然希望應用擁有正常的身份驗證流程。

要創建表,請運行:

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

現在可以運行應用,用戶應該能夠使用導航欄中的鏈接註冊和登錄。

修改登錄鏈接

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

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

resources/views/layouts/app.blade.php

php artisan make:auth

當未登錄的用戶嘗試訪問受保護的路由時,他們應該被帶到新的自定義登錄視圖,而不是正常的登錄視圖。此行為在authenticate中間件中指定。我們需要對其進行調整:

app/Http/Middleware/Authenticate.php

php artisan migrate

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

創建魔法登錄控制器、視圖和路由

下一步是在Auth文件夾中創建MagicLoginController:

[...]
@if (Auth::guest())
<li><a href="https://www.php.cn/link/9964364bfd2b38643a0b41b981c01f60'/login/magiclink') }}">Login</a></li>
<li><a href="https://www.php.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文件夾中創建一個magic文件夾來保存此新視圖:

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

讓我們將新創建的視圖更新為:

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

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

我們將保留使用密碼登錄的選項,因為用戶可能仍然選擇密碼登錄。因此,如果用戶點擊導航欄中的登錄,他們將看到如下所示的登錄視圖:

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

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

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

通過以上步驟,您就可以在 Laravel 應用中實現一個安全可靠的無密碼登錄系統,為用戶提供更便捷、更安全的登錄體驗。 請記住根據您的實際需求調整令牌過期時間和其他設置。 完整的代碼和更詳細的步驟,請參考您提供的完整代碼鏈接。

以上是讓殺死密碼!魔術登錄鏈接到救援!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

使用PHP會話時有哪些性能考慮?使用PHP會話時有哪些性能考慮?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP會話與Cookie有何不同?PHP會話與Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)