如何使用Laravel/Sanctum在SPA应用程序中实现ForgotPasswordController?

如何使用Laravel/Sanctum在SPA应用程序中实现ForgotPasswordController?,laravel,laravel-7,laravel-sanctum,Laravel,Laravel 7,Laravel Sanctum,我用的是Laravel7.x和sanctum。登录正常,我想从SPA应用程序中创建一个忘记密码选项 由于文档中的大多数示例都依赖于auth脚手架,因此我正在努力学习基础知识。到目前为止,我已成功获得以下信息: const crypto = require('crypto') crypto.randomBytes(20, (err, buffer) => { var token = buffer.toString('hex') console.log(token)

我用的是Laravel7.x和sanctum。登录正常,我想从SPA应用程序中创建一个忘记密码选项

由于文档中的大多数示例都依赖于auth脚手架,因此我正在努力学习基础知识。到目前为止,我已成功获得以下信息:

const crypto = require('crypto')
crypto.randomBytes(20, (err, buffer) => {
    var token = buffer.toString('hex')
    console.log(token)

    let url = 'password/email'
    axios.post(url, {
        token: token,
        email: this.resetEmail
    })
    .then((res) => {
        console.log(res)
    }, (err) => {
        this.has_error = true
        let errorResp = err.response.data
        if (errorResp.errors.email) {
            console.log(errorResp.errors.email[0])
        }
    })
})
  • 我有一个名为
    ForgotPasswordController
    的控制器类,它有一个名为
    reset
    的方法,通过POST接收要重置的电子邮件
  • 我已经创建了一个对象:
    $user=user::where('email',$email)->get()->first()
此时,我对体系结构太不熟悉,不知道下一步该怎么做,无论是密码外观,我在
Illuminat\Auth\Password
名称空间中看到了一些额外的类。我的目标是创建一个过期令牌,通过默认的电子邮件配置将其发送给用户(我知道如何发送电子邮件/设计模板),然后能够进行webservice调用,从而允许解析密码

这是我想我知道的。。。
  • 我在我的用户模型上设置了
    CanResetPassword
    trait,我认为这是支持本机密码重置方法所必需的
  • 我相信目标是针对一段时间后过期的用户电子邮件创建一个重置令牌,然后将该令牌附加到电子邮件中的url中发送(我不知道围绕表行之外的令牌生成的架构含义)
  • 有一个
    Password
    facade和一个
    sendResetLink
    方法,但是 方法无法用于spa应用程序,因为 客户端应用程序将是不同的,所以我假设必须重新编写一些本机应用程序。事实上,调用此方法将返回一个错误
    Route[password.reset]not defined
我假设我需要密码外观,如果需要,生成令牌的方法是什么?我应该只通过电子邮件发送附加了令牌的链接,还是有其他架构考虑来支持令牌过期

抱歉,如果我的问题有缺陷,我对体系结构不清楚,所以我在做假设。

你试过Laravel吗?所有身份验证要求都已移动到名为
laravel/ui
的包中

通过安装该软件包,您可以使用Laravel身份验证。它将负责您的注册、登录和忘记密码过程

这个软件包将为所有这些进程创建一些控制器,您需要这些控制器

  • 放弃密码控制器
    :将生成并发送重置密码链接
  • ResetPasswordController
    :将通过获取用户的电子邮件、新密码和重置密码令牌来重置密码
但是如果您不想使用正式的Laravel软件包,您应该采取以下步骤:

  • 向用户显示“请求重置密码表”
  • 验证用户提供的电子邮件
  • 生成一个随机重置密码令牌并将其存储在DB(需要一个至少包含两个字段的表:
    email
    token
  • 将该令牌发送给用户(最好将其作为重置密码链接中的URL参数发送)
  • 当用户导航到重置密码页面时,再次请求电子邮件,并通过检查DB表并匹配电子邮件和令牌来验证令牌
  • 此时,将密码重置为用户想要的任何密码
  • 更新:我使用这段代码生成随机令牌:

    $email = 'user@email.com';
    $token = \Illuminate\Support\Str::random(10);
    
    while(\DB::table('reset_password_tokens')->where('token', $token)->exists()) {
        $token = \Illuminate\Support\Str::random(10);
    }
    
    \DB::table('reset_password_tokens')->insert(compact('email', 'token'));
    

    要在使用SPA时生成令牌,请执行以下操作:

    const crypto = require('crypto')
    crypto.randomBytes(20, (err, buffer) => {
        var token = buffer.toString('hex')
        console.log(token)
    
        let url = 'password/email'
        axios.post(url, {
            token: token,
            email: this.resetEmail
        })
        .then((res) => {
            console.log(res)
        }, (err) => {
            this.has_error = true
            let errorResp = err.response.data
            if (errorResp.errors.email) {
                console.log(errorResp.errors.email[0])
            }
        })
    })
    

    这是我确定的方法,我不确定如何通过Laravel体系结构生成实际的令牌,如果你知道的话,你能在你的答案中包含这一点吗?@Shane我更新了我的答案并添加了一段代码。我希望它对你有用。