我正在构建一个角度应用程序,并希望实现密码重置。但是,默认的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发送的带有重置链接的电子邮件模板在哪里?
答案 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。