让杀死密码!魔术登录链接到救援!
告别密码烦恼,拥抱安全便捷的无密码登录!本文将指导您如何在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中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

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

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

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP中有四种主要错误类型:1.Notice:最轻微,不会中断程序,如访问未定义变量;2.Warning:比Notice严重,不会终止程序,如包含不存在文件;3.FatalError:最严重,会终止程序,如调用不存在函数;4.ParseError:语法错误,会阻止程序执行,如忘记添加结束标签。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

HTTP请求方法包括GET、POST、PUT和DELETE,分别用于获取、提交、更新和删除资源。1.GET方法用于获取资源,适用于读取操作。2.POST方法用于提交数据,常用于创建新资源。3.PUT方法用于更新资源,适用于完整更新。4.DELETE方法用于删除资源,适用于删除操作。

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

在PHPOOP中,self::引用当前类,parent::引用父类,static::用于晚静态绑定。1.self::用于静态方法和常量调用,但不支持晚静态绑定。2.parent::用于子类调用父类方法,无法访问私有方法。3.static::支持晚静态绑定,适用于继承和多态,但可能影响代码可读性。

PHP通过$\_FILES变量处理文件上传,确保安全性的方法包括:1.检查上传错误,2.验证文件类型和大小,3.防止文件覆盖,4.移动文件到永久存储位置。
