告别密码烦恼,拥抱安全便捷的无密码登录!本文将指导您如何在Laravel应用中实现基于一次性链接的无密码登录系统,提升安全性并简化用户体验。
本文由Younes Rafie和Wern Ancheta审核。感谢所有SitePoint的同行评审员,使SitePoint的内容达到最佳状态!
身份验证技术不断发展,从传统的邮箱-密码组合,到社交登录,再到如今的无密码登录(更准确地说是“仅邮箱”登录)。无密码登录系统通过向用户邮箱发送登录链接来验证身份。
无密码登录流程如下:
- 用户访问登录页面;
- 输入邮箱地址并确认;
- 系统向邮箱发送登录链接;
- 点击链接后,用户被重定向回应用并登录;
- 链接失效。
如果您忘记应用密码但记得注册邮箱,此方法非常实用。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'); } [...] }
我们将保留使用密码登录的选项,因为用户可能仍然选择密码登录。因此,如果用户点击导航栏中的登录,他们将看到如下所示的登录视图:
剩余部分由于篇幅限制,无法全部展开,但基本思路如下:
-
生成并关联令牌: 创建路由和控制器方法来处理登录表单的提交操作,验证邮箱地址,为用户生成令牌,并将令牌与用户关联。使用
str_random()
生成随机令牌,并将其存储在数据库中。 -
发送令牌邮件: 在
UserToken
模型中添加方法,使用 Laravel 的邮件功能发送包含登录链接的邮件。链接应包含令牌、邮箱地址和记住我的值。 使用Mail::raw()
发送纯文本邮件,或创建邮件视图以增强邮件外观。 -
令牌验证和身份验证: 创建路由和控制器方法来处理登录链接的点击操作。使用路由模型绑定获取令牌,验证令牌是否过期以及是否属于提交的邮箱地址。使用
Carbon
库来检查令牌的过期时间。验证成功后,使用Auth::login()
登录用户,并删除已使用的令牌。
通过以上步骤,您就可以在 Laravel 应用中实现一个安全可靠的无密码登录系统,为用户提供更便捷、更安全的登录体验。 请记住根据您的实际需求调整令牌过期时间和其他设置。 完整的代码和更详细的步骤,请参考您提供的完整代码链接。
以上是让杀死密码!魔术登录链接到救援!的详细内容。更多信息请关注PHP中文网其他相关文章!

负载均衡会影响会话管理,但可以通过会话复制、会话粘性和集中式会话存储解决。1.会话复制在服务器间复制会话数据。2.会话粘性将用户请求定向到同一服务器。3.集中式会话存储使用独立服务器如Redis存储会话数据,确保数据共享。

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

PHP会话的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。1.Cookies通过在客户端存储数据来管理会话,简单但安全性低。2.Token-basedAuthentication使用令牌验证用户,安全性高但需额外逻辑。3.Database-basedSessions将数据存储在数据库中,扩展性好但可能影响性能。4.Redis/Memcached使用分布式缓存提高性能和扩展性,但需额外配

Sessionhijacking是指攻击者通过获取用户的sessionID来冒充用户。防范方法包括:1)使用HTTPS加密通信;2)验证sessionID的来源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

本文比较了PHP和ASP.NET,重点是它们对大规模Web应用程序,性能差异和安全功能的适用性。两者对于大型项目都是可行的,但是PHP是开源和无关的,而ASP.NET,


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

记事本++7.3.1
好用且免费的代码编辑器

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版
中文版,非常好用

Dreamweaver CS6
视觉化网页开发工具