【问题标题】:Laravel: resetting password without getting redirect responseLaravel:重置密码而不获得重定向响应
【发布时间】:2016-07-12 19:49:17
【问题描述】:

我正在构建一个 Angular 应用程序并希望实现密码重置。但是,默认的 laravel 配置似乎不允许使用纯 XMLHttpRequest ($http.post) 请求来执行此操作,并以 302 重定向响应。

通过在 authController 类中实现所述方法并返回 json 响应,我设法让 postLogin 和 postRegister 工作而无需发出重定向,这样做会覆盖所述方法的默认 laravel 实现。 postEmail 没有这样的运气,似乎根本没有命中该方法,我只是立即收到 302 响应。

理想情况下,除了检查他们的电子邮件之外,我根本不希望用户离开单页 Angular 应用程序。 所以 1. 用户将电子邮件发布到 postEmail -> 带有重置链接或更好的“重置代码”的电子邮件被发送到电子邮件地址 -> 用户然后将重置令牌代码输入到已经打开的网络应用程序中,或者如果它不能完成后,浏览到在新标签页中打开的重置密码页面。

我尝试这样实现 postEmail 方法:

public function postEmail(Request $request)
            {

                $this->validate($request, ['email' => 'required|email']);

                $response = Password::sendResetLink($request->only('email'), function (Message $message) {
                    $message->subject($this->getEmailSubject());
                });

                switch ($response) {
                    case Password::RESET_LINK_SENT:


                         return response()->json(['msg' => 'A reset link has been sent to your E-mail'], 200);

                    case Password::INVALID_USER:


                         return response()->json(['msg' => 'This E-mail cannot be found in our system'], 200);
                }
            }

另外,laravel发出的带有reset链接的邮件模板在哪里?

【问题讨论】:

  • 你需要创建一个PasswordController来扩展postEmail()方法。

标签: angularjs laravel laravel-5


【解决方案1】:

您可以在 App\Http\Controllers\Auth 命名空间中创建 PasswordController 来扩展密码重置方法。

<?php 

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Auth\PasswordBroker;
use Illuminate\Foundation\Auth\ResetsPasswords;

class PasswordController extends Controller 
{
    use ResetsPasswords;

    public function postEmail(Request $request)
    {

    }

}

要覆盖电子邮件模板,您可以在app/views/emails/auth directory 中创建reminder.blade.php,或在app/config/auth.php 配置中更改模板文件的位置。

【讨论】:

    【解决方案2】:

    虽然接受的答案完全有效,但不覆盖原始通知类的另一个解决方案如下,ResetPassword 提供了一个名为 createUrlUsing 的静态方法,它接受 Closure,因此我们可以将 URL 覆盖为类似下面:

    use Illuminate\Support\Facades\Password;
    use Illuminate\Auth\Notifications\ResetPassword;
    
    ...
    
    $status = Password::sendResetLink(
        ['email' => $args['email']],
        function ($user, $token) {
            ResetPassword::createUrlUsing(function ($notifiable, $token) {
                // This is where you override the URL, you can also take a look at 
                // the `url`, `action` and `route` functions in Laravel and skip  
                // `sprintf` if you prefer to stick to Laravel functions only.
                return sprintf(
                    "%s/%s/?token=%s&email=%s",
                    config('your.optional.frontend_url'),
                    config('your.optional.password_reset'),
                    $token,
                    $notifiable->getEmailForPasswordReset(),
                ); // frontend_url/password_url/?token=TOKEN&email=EMAIL
            });
            return $user->notify(new ResetPassword($token));
        }
    );
    
    // This is an optional way to handle the final response, you can convert it to
    // JSON or even ignore it.
    return $status === Password::RESET_LINK_SENT
        ? ['status' => __($status)]
        : throw new Error(__($status));
    

    这段代码应该放在一个新的路由来处理密码重置请求,而不是使用默认的 Laravel 。

    【讨论】:

      最近更新 更多