告别密码烦恼,拥抱安全便捷的无密码登录!本文将指导您如何在Laravel应用中实现基于一次性链接的无密码登录系统,提升安全性并简化用户体验。
本文由Younes Rafie和Wern Ancheta审核。感谢所有SitePoint的同行评审员,使SitePoint的内容达到最佳状态!
身份验证技术不断发展,从传统的邮箱-密码组合,到社交登录,再到如今的无密码登录(更准确地说是“仅邮箱”登录)。无密码登录系统通过向用户邮箱发送登录链接来验证身份。
无密码登录流程如下:
如果您忘记应用密码但记得注册邮箱,此方法非常实用。Slack等应用也采用了这种技术。本教程将演示如何在Laravel应用中实现此系统。完整代码请见此处。
首先,创建一个新的Laravel应用。本教程使用Laravel 5.2:
<code class="language-bash">composer create-project laravel/laravel passwordless-laravel 5.2.*</code>
如果您已有包含用户和密码的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版本引入了一项很棒的功能:只需一条命令即可添加预制身份验证层。让我们执行此操作:
<code class="language-bash">composer create-project laravel/laravel passwordless-laravel 5.2.*</code>
此命令会构建身份验证所需的一切,即视图、控制器和路由。
在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
<code class="language-bash">php artisan make:auth</code>
当未登录的用户尝试访问受保护的路由时,他们应该被带到新的自定义登录视图,而不是正常的登录视图。此行为在authenticate中间件中指定。我们需要对其进行调整:
app/Http/Middleware/Authenticate.php
<code class="language-bash">php artisan migrate</code>
请注意,在else块中,我们已将重定向更改为指向login/magiclink,而不是正常的login。
下一步是在Auth文件夹中创建MagicLoginController:
<code class="language-html">[...] @if (Auth::guest()) <li><a href="https://www.php.cn/link/9964364bfd2b38643a0b41b981c01f60'/login/magiclink')%20%7D%7D">Login</a></li> <li><a href="https://www.php.cn/link/9964364bfd2b38643a0b41b981c01f60'/register')%20%7D%7D">Register</a></li> [...]</code>
然后是显示自定义登录页面的路由:
app/Http/routes.php
<code class="language-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); } [...]</code>
让我们更新MagicLoginController以包含show操作:
app/Http/Controllers/Auth/MagicLoginController.php
<code class="language-bash">php artisan make:controller Auth\MagicLoginController</code>
对于新的登录视图,我们将借用正常的登录视图,但删除密码字段。我们还将表单的post URL更改为指向/login/magiclink
。
让我们在views/auth文件夹中创建一个magic文件夹来保存此新视图:
<code class="language-php">[...] Route::get('/login/magiclink', 'Auth\MagicLoginController@show');</code>
让我们将新创建的视图更新为:
resources/views/auth/magic/login.blade.php
<code class="language-php">class MagicLoginController extends Controller { [...] public function show() { return view('auth.magic.login'); } [...] }</code>
我们将保留使用密码登录的选项,因为用户可能仍然选择密码登录。因此,如果用户点击导航栏中的登录,他们将看到如下所示的登录视图:
剩余部分由于篇幅限制,无法全部展开,但基本思路如下:
str_random()
生成随机令牌,并将其存储在数据库中。UserToken
模型中添加方法,使用 Laravel 的邮件功能发送包含登录链接的邮件。链接应包含令牌、邮箱地址和记住我的值。 使用 Mail::raw()
发送纯文本邮件,或创建邮件视图以增强邮件外观。Carbon
库来检查令牌的过期时间。验证成功后,使用 Auth::login()
登录用户,并删除已使用的令牌。通过以上步骤,您就可以在 Laravel 应用中实现一个安全可靠的无密码登录系统,为用户提供更便捷、更安全的登录体验。 请记住根据您的实际需求调整令牌过期时间和其他设置。 完整的代码和更详细的步骤,请参考您提供的完整代码链接。
以上是让杀死密码!魔术登录链接到救援!的详细内容。更多信息请关注PHP中文网其他相关文章!