0

0

Laravel Fortify 自定义密码创建流程中的令牌生成指南

聖光之護

聖光之護

发布时间:2025-08-22 15:26:01

|

776人浏览过

|

来源于php中文网

原创

Laravel Fortify 自定义密码创建流程中的令牌生成指南

在 Laravel Fortify 中实现自定义用户密码创建(如欢迎邮件)时,直接使用 Str::random() 生成的令牌无法通过验证。本文将指导您如何利用 Laravel 内置的 PasswordBroker 服务,生成与 Fortify 兼容且可用于密码重置或创建的有效令牌,确保自定义流程的安全性与功能性。

挑战:自定义密码创建与令牌验证

在许多应用场景中,我们可能需要自定义用户注册后的密码设置流程。例如,在用户首次注册时,不直接设置密码,而是向其发送一封包含链接的欢迎邮件,引导用户点击链接进入页面自行创建密码。这种“密码创建”流程与 laravel fortify 提供的“密码重置”流程在本质上是相似的,都需要一个安全的、有时效性的令牌来验证用户的身份。

然而,当开发者尝试手动生成令牌,例如使用 Str::random(60),并将其发送给用户时,往往会发现该令牌无法通过 Laravel Fortify 或其底层 PasswordBroker 的验证。这是因为 Laravel 的密码重置/创建机制并非简单地验证随机字符串,它要求令牌必须通过特定的内部服务生成并存储,以便后续进行验证。

理解 Laravel 的 PasswordBroker 服务

Laravel 提供了一个强大的 PasswordBroker 服务,专门用于管理用户密码重置的整个生命周期。这个服务负责:

  1. 生成令牌: 创建一个加密且具有时效性的令牌。
  2. 存储令牌: 将生成的令牌与对应的用户ID和创建时间一同存储在数据库的 password_resets 表中。
  3. 验证令牌: 在用户尝试重置密码时,根据数据库中的记录验证提供的令牌是否有效、是否过期。
  4. 删除令牌: 密码重置成功后,删除对应的令牌,确保令牌一次性使用。

因此,如果我们需要在自定义流程中生成一个能被 Laravel 验证的令牌,就必须利用这个 PasswordBroker 服务。

正确生成兼容令牌的方法

要生成一个与 Laravel Fortify 兼容的令牌,我们需要从 Laravel 的服务容器中获取 PasswordBroker 实例,并调用其 createToken() 方法。该方法会为指定的用户生成一个有效的令牌,并自动将其存储在 password_resets 表中。

以下是在自定义用户创建流程中生成有效令牌的示例代码:

validated(),
                ['password' => bcrypt(Str::random(8))] // 初始设置一个随机密码,或者可以设置为 null
            )
        );

        // 2. 使用 PasswordBroker 服务生成令牌
        // 从服务容器中获取 PasswordBroker 实例
        $passwordBroker = app(PasswordBroker::class);
        // 为指定用户生成令牌,并自动存储到 password_resets 表
        $token = $passwordBroker->createToken($user);

        // 3. 发送包含令牌的密码创建通知邮件
        // 假设您已经定义了 sendPasswordCreateNotification 方法
        // 并且该方法接受一个令牌作为参数,用于构建密码设置链接
        $user->sendPasswordCreateNotification($token);

        // 返回重定向或其他响应
        return redirect()->route('users.index')->with('success', '用户已创建,密码设置邮件已发送!');
    }
}

代码解析:

  1. app(PasswordBroker::class): 这是 Laravel 服务容器的辅助函数,用于解析并获取 Illuminate\Auth\Passwords\PasswordBroker 类的实例。
  2. $passwordBroker->createToken($user): 调用 PasswordBroker 实例的 createToken() 方法,并传入 User 模型实例。此方法会执行以下操作:
    • 生成一个加密的安全令牌。
    • 将该令牌、用户 ID (user_id) 和创建时间 (created_at) 存储到 password_resets 数据库表中。
    • 返回生成的令牌字符串。

通过这种方式获取的 $token 是一个有效的、与 Laravel 密码重置机制完全兼容的令牌。当用户点击邮件中的链接,访问到您的密码设置页面时,您可以使用 Fortify 提供的密码重置视图和逻辑,或者自定义控制器来验证这个令牌。

BibiGPT-哔哔终结者
BibiGPT-哔哔终结者

B站视频总结器-一键总结 音视频内容

下载

邮件通知与路由配置

在上述示例中,我们假设 sendPasswordCreateNotification($token) 方法已经存在。您需要确保您的用户模型包含类似以下的方法,并且您的通知类(例如 PasswordCreateNotification)能够构建包含此令牌的 URL。

User 模型中的通知方法示例:

// app/Models/User.php

use App\Notifications\PasswordCreateNotification; // 引入您的通知类

class User extends Authenticatable
{
    // ... 其他属性和方法

    /**
     * 发送密码创建通知。
     *
     * @param string $token
     * @return void
     */
    public function sendPasswordCreateNotification(string $token): void
    {
        $this->notify(new PasswordCreateNotification($token));
    }
}

通知类 (PasswordCreateNotification) 示例:

// app/Notifications/PasswordCreateNotification.php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

class PasswordCreateNotification extends Notification
{
    use Queueable;

    public string $token;

    /**
     * 创建一个新的通知实例。
     *
     * @param string $token
     * @return void
     */
    public function __construct(string $token)
    {
        $this->token = $token;
    }

    /**
     * 获取通知的交付渠道。
     *
     * @param mixed $notifiable
     * @return array
     */
    public function via(mixed $notifiable): array
    {
        return ['mail'];
    }

    /**
     * 获取邮件表示形式的通知。
     *
     * @param mixed $notifiable
     * @return MailMessage
     */
    public function toMail(mixed $notifiable): MailMessage
    {
        // 构建密码设置链接
        // 假设您的密码设置路由是 'password.create.form',并且接受 token 和 email 参数
        $url = url(route('password.create.form', [
            'token' => $this->token,
            'email' => $notifiable->getEmailForPasswordReset(),
        ], false)); // false 表示生成相对 URL,如果需要绝对 URL,请根据实际情况调整

        return (new MailMessage)
                    ->subject('请设置您的账户密码')
                    ->line('您好,请点击下方链接为您的账户设置密码:')
                    ->action('设置密码', $url)
                    ->line('如果您没有请求此操作,请忽略此邮件。');
    }
}

路由配置示例 (web.php):

// routes/web.php

use App\Http\Controllers\Auth\NewPasswordController; // 假设您自定义了控制器

// 自定义密码创建路由,用于展示密码设置表单
Route::get('/create-password/{token}', [NewPasswordController::class, 'create'])
    ->name('password.create.form');

// 处理密码创建提交
Route::post('/create-password', [NewPasswordController::class, 'store'])
    ->name('password.create.store');

在 NewPasswordController 中,您可以使用与 Fortify 密码重置控制器类似的逻辑来验证令牌并更新用户密码。

注意事项

  • 数据库迁移: 确保您的数据库中存在 password_resets 表。Laravel 默认提供了此迁移文件 (xxxx_create_password_resets_table.php),如果尚未运行,请执行 php artisan migrate。
  • 令牌有效期: PasswordBroker 生成的令牌通常具有默认的有效期(默认为 60 分钟),您可以在 config/auth.php 文件中调整 passwords.users.expire 配置项。
  • 安全性: 令牌是一次性使用的。一旦用户成功设置了密码,对应的令牌应立即从 password_resets 表中删除。Laravel 的 PasswordBroker 在密码重置成功后会自动处理这一点。
  • 错误处理: 在处理用户提交的密码设置请求时,务必对令牌进行严格验证,并提供友好的错误提示。

总结

在 Laravel Fortify 中实现自定义的用户密码创建流程时,关键在于正确生成和管理令牌。直接使用 Str::random() 生成的令牌无法被 Laravel 的内置验证机制识别。通过利用 Illuminate\Auth\Passwords\PasswordBroker 服务,我们可以生成一个与 Fortify 完全兼容的有效令牌,并将其安全地发送给用户。这种方法不仅保证了流程的安全性,也充分利用了 Laravel 提供的强大认证功能,确保了自定义功能的稳定性和可靠性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

320

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

278

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

373

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

374

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

85

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

65

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

68

2025.08.05

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6169

2023.09.14

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

0

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号