首页 >后端开发 >php教程 >让杀死密码!魔术登录链接到救援!

让杀死密码!魔术登录链接到救援!

William Shakespeare
William Shakespeare原创
2025-02-10 12:27:14543浏览

告别密码烦恼,拥抱安全便捷的无密码登录!本文将指导您如何在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:

<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>

我们将保留使用密码登录的选项,因为用户可能仍然选择密码登录。因此,如果用户点击导航栏中的登录,他们将看到如下所示的登录视图:

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