Laravel:重置密码而不会获得重定向响应

时间:2016-03-25 03:13:08

标签: angularjs laravel laravel-5

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

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

理想情况下,除了检查他们的电子邮件之外,我不希望用户完全离开单页角度应用程序。 所以1.用户发帖电子邮件到postEmail - >通过重置链接或更好的电子邮件重置代码'被发送到电子邮件地址 - >然后,用户将重置令牌代码输入到已打开的Web应用程序中,或者如果无法完成,请浏览以重置在新选项卡中打开的密码页面。

我尝试实现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发送的带有重置链接的电子邮件模板在哪里?

2 个答案:

答案 0 :(得分: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配置中更改模板文件的位置。

答案 1 :(得分:0)

虽然接受的答案完全有效,但另一种无需覆盖原始通知类的解决方案如下,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。