尝试在 Lumen 中重置密码

Trying to reset Passwords in Lumen

我正在尝试在 Lumen 中实现密码重置功能,但未能成功。

Lumen 可以访问 Laravel 的 PasswordBrokerPasswordManager 之类的东西,但我无法使用它并且成功。有什么解决办法吗

我昨晚才弄明白这个问题并写了一篇关于它的博客:

http://www.imjohnbon.com/password-resets-in-lumen/

希望它至少能让你走上正轨。

好的,所以我自己使用 Lumen 5.6 完成了这项工作。 (我已经升级到 5.8,仍然有效,没有做任何更改)。

这些是我必须对我的代码所做的更改。我不得不调整一些东西以适应我的系统,但这可能会对其他人有所帮助。

路线

我想要两条路线。

  1. 发送重设密码邮件

GET auth/resetpassword?email=fred@example.com

  1. 重设密码

PUT auth/resetpassword?token=281...b&username=fred&password=banana&password_confirmation=banana

作曲家

要向用户发送电子邮件,需要以下 Laravel 包:

composer require illuminate/mail "^5.6"
composer require illuminate/notifications "^5.6"

配置文件

需要一些额外的配置文件:

  • config/auth.php
  • config/mail.php

我只是从 Laravel 5.6 复制过来的,没有做任何改动。我还将邮件变量添加到我的 .env 文件中。

bootstrap/app.php

这些新文件需要在应用程序中注册:

$app->configure('auth');
$app->configure('mail');

$app->register(Illuminate\Notifications\NotificationServiceProvider::class);
$app->register(\Illuminate\Mail\MailServiceProvider::class);
$app->alias('mailer', \Illuminate\Contracts\Mail\Mailer::class);
$app->withFacades();

数据库

我用的是默认的Laravelpassword_resetstable:

Schema::create('password_resets', function (Blueprint $table) {
    $table->string('email')->index();
    $table->string('token');
    $table->timestamp('created_at')->nullable();
});

现在对代码进行真正的修改。

基于 Illuminate\Foundation\Auth\SendsPasswordResetEmailsIlluminate\Foundation\Auth\ResetsPasswords.

中的代码

AuthController

use Illuminate\Auth\Passwords\PasswordBrokerManager;
use Illuminate\Support\Facades\Password;
use Laravel\Lumen\Routing\Controller;
use Illuminate\Http\Request;

class AuthController extends Controller
{
    // 1. Send reset password email
    public function generateResetToken(Request $request)
    {
        // Check email address is valid
        $this->validate($request, ['email' => 'required|email']);

        // Send password reset to the user with this email address
        $response = $this->broker()->sendResetLink(
            $request->only('email')
        );

        return $response == Password::RESET_LINK_SENT
            ? response()->json(true)
            : response()->json(false);
    }

    // 2. Reset Password
    public function resetPassword(Request $request)
    {
        // Check input is valid
        $rules = [
            'token'    => 'required',
            'username' => 'required|string',
            'password' => 'required|confirmed|min:6',
        ];
        $this->validate($request, $rules);

        // Reset the password
        $response = $this->broker()->reset(
        $this->credentials($request),
            function ($user, $password) {
                $user->password = app('hash')->make($password);
                $user->save();
            }
        );

        return $response == Password::PASSWORD_RESET
            ? response()->json(true)
            : response()->json(false);
    }

    /**
     * Get the password reset credentials from the request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    protected function credentials(Request $request)
    {
        return $request->only('username', 'password', 'password_confirmation', 'token');
    }

    /**
     * Get the broker to be used during password reset.
     *
     * @return \Illuminate\Contracts\Auth\PasswordBroker
     */
    public function broker()
    {
        $passwordBrokerManager = new PasswordBrokerManager(app());
        return $passwordBrokerManager->broker();
    }
}

用户模型

use Illuminate\Auth\Passwords\CanResetPassword as CanResetPasswordTrait;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordInterface;
use Illuminate\Notifications\Notifiable;

class User extends Model implements CanResetPasswordInterface
{
    use CanResetPasswordTrait;
    use Notifiable;

    ...
}