【问题标题】:How can i call laravel passport's forgot password and verify api with angular 8?我如何调用 laravel 护照的忘记密码并使用 angular 8 验证 api?
【发布时间】:2019-10-29 18:48:38
【问题描述】:

我正在尝试使用 laravel 护照在 Angular 8 中实现验证电子邮件并忘记密码,但我找不到他们的 api。

我手动写了几个api,但是这些都行不通。

Route::get('email/verify', 'Auth\VerificationController@verify');
Route::get('forgot','Auth\ForgotPasswordController');

有人知道我该怎么做吗?

【问题讨论】:

    标签: angular laravel


    【解决方案1】:

    在你的 api.php 中添加这些路由,

    // forget password
    Route::post('forget', 'Auth\ForgotPasswordController@getResetToken');
    
    //reset password
    Route::post('password/reset', 'Auth\ResetPasswordController@reset');
    
    //user verification
    Route::get('email/verify/{token}', 'Auth\VerificationController@verify');
    

    在 ForgetPasswordController 中添加这个,

    <?php
    
    namespace App\Http\Controllers\Auth;
    
    use App\Http\Controllers\Controller;
    use App\User;
    use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Password;
    class ForgotPasswordController extends Controller
    {
        use SendsPasswordResetEmails;
        public function __construct()
        {
            $this->middleware('guest');
        }
    
        public function getResetToken(Request $request)
        {
            $this->validate($request, ['email' => 'required|email']);
            $sent = $this->sendResetLinkEmail($request);
    
            return ($sent) 
                ? response()->json(['message'=>'Success'])
                : response()->json(['message'=>'Failed']);
    
        }
    
        public function sendResetLinkEmail(Request $request)
        {
            $this->validateEmail($request);
            $response = $this->broker()->sendResetLink(
                $request->only('email')
            );
            return $response == Password::RESET_LINK_SENT ? 1 : 0;
        }
    }
    
    

    创建一个特征 SendsPasswordResetEmails,并添加如下代码。在 App\Http\Traits\SendsPasswordResetEmails 位置,你可以在你喜欢的地方创建。

    <?php
    namespace App\Http\Traits;
    use Illuminate\Http\Request;
    use App\Http\Traits\Password;
    use Illuminate\Http\RedirectResponse;
    trait SendsPasswordResetEmails
    {
    
        public function showLinkRequestForm()
        {
            return  new RedirectResponse("http://localhost:8000/password/reset");
        }
    
        public function sendResetLinkEmail(Request $request)
        {
            $this->validateEmail($request);
            $response = $this->broker()->sendResetLink(
                $request->only('email')
            );
            return $response == Password::RESET_LINK_SENT
                        ? $this->sendResetLinkResponse($response)
                        : $this->sendResetLinkFailedResponse($request, $response);
        }
    
        protected function validateEmail(Request $request)
        {
            $this->validate($request, ['email' => 'required|email']);
        }
    
        protected function sendResetLinkResponse($response)
        {
            return back()->with('status', trans($response));
        }
    
        protected function sendResetLinkFailedResponse(Request $request, $response)
        {
            return back()->withErrors(
                ['email' => trans($response)]
            );
        }
    
        public function broker()
        {
            return Password::broker();
        }
    }
    
    
    

    ResetPasswordController 是这样的,

    <?php
    
    namespace App\Http\Controllers\Auth;
    
    use App\Http\Controllers\Controller;
    use App\Transformers\Json;
    use Illuminate\Foundation\Auth\ResetsPasswords;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Password;
    use Illuminate\Http\RedirectResponse;
    
    class ResetPasswordController extends Controller
    {
        public function __construct()
        {
            $this->middleware('guest');
        }
    
        public function reset(Request $request)
        {
            $this->validate($request, $this->rules(), $this->validationErrorMessages());
            $response = $this->broker()->reset(
                $this->credentials($request), function ($user, $password) {
                    $this->resetPassword($user, $password);
                }
            );
            if ($request->wantsJson()) {
                if ($response == Password::PASSWORD_RESET) {
                    return response()->json(['data'=>trans('passwords.reset')]);
                } else {
                    return response()->json(['email' => $request->input('email'), 'data'=>trans($response)]);
                }
            }
            $response == Password::PASSWORD_RESET
            ? $this->sendResetResponse($response)
            : $this->sendResetFailedResponse($request, $response);
    
            return  new RedirectResponse(env("yourdomain")+"?verified=$response");
    
        }
    }
    
    

    最后你在 VerificationController 中创建验证方法,它看起来像

    public function verifyUser($token)
        {
            $verifyUser = VerifyUser::where('token', $token)->first();
            if (isset($verifyUser)) {
                $user = $verifyUser->user;
                if (!$user->verified) {
                    $verifyUser->user->verified = 1;
                    $verifyUser->user->save();
                    $status = "success";
                } else {
                    $status = "already-verified";
                }
                return new RedirectResponse(env("yourdomain")+"/profile/edit?verified=$status");
            } else {
                $status = "duplicate-email";
                return new RedirectResponse(env("yourdomain")+"/profile/edit?verified=$status");
            }
            return new RedirectResponse(env("yourdomain")+"?andParams=$status");
    
        }
    

    *命名空间可能不同,并且您的代码中的控制器或方法可能不同。其余的逻辑将是相同的。

    【讨论】:

    • 这不起作用,我得到 Route [password.reset] 未定义。
    • @guilhermevictorramalhonatal 你需要先运行这 3 个命令来安装 Laravel 的 laravel/ui 包到 auth:1 - composer 需要 laravel/ui,2 - php artisan ui vue --auth,3 - php artisan迁移
    • @FellipeSanches 我正在使用反应
    • @guilhermevictorramalhonatal 好的,但是你需要 Laravel laravel/ui 包来修复 password.reset] 未定义。
    • 要解决 [password.reset] 问题,您需要按此链接中的说明命名路由:stackoverflow.com/a/45157498/529151
    【解决方案2】:

    api.php

    Route::post('password/forgot-password', 'AuthAPIController@forgotPassword');
    Route::post('password/reset', 'AuthAPIController@passwordReset');
    

    AuthAPIController

    别忘了导入这个 tinks

    use Illuminate\Support\Facades\Hash;
    use Illuminate\Support\Facades\Password;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Validator;
    

    忘记密码方法

    public function forgotPassword(Request $request){
        $input = $request->only('email');
        $validator = Validator::make($input, [
            'email' => "required|email"
        ]);
        if ($validator->fails()) {
            return response()->json($validator->errors());
        }
        $response = Password::sendResetLink($input);
    
        $message = $response == Password::RESET_LINK_SENT ? 'Mail send successfully' : GLOBAL_SOMETHING_WANTS_TO_WRONG;
        
        return response()->json($message);
    }
    

    重置密码方法

    public function passwordReset(Request $request){
        $input = $request->only('email','token', 'password', 'password_confirmation');
        $validator = Validator::make($input, [
            'token' => 'required',
            'email' => 'required|email',
            'password' => 'required|confirmed|min:8',
        ]);
        if ($validator->fails()) {
            return response()->json($validator->errors());
        }
        $response = Password::reset($input, function ($user, $password) {
            $user->password = Hash::make($password);
            $user->save();
        });
        $message = $response == Password::PASSWORD_RESET ? 'Password reset successfully' : GLOBAL_SOMETHING_WANTS_TO_WRONG;
        return response()->json($message);
    }
    

    【讨论】:

    • 你可能需要 php artisan make:notification ResetPassword
    • 如果你使用 composer require laravel/ui,来自 Laravel 版本的旧代码也可能会工作
    • 你在哪里获得重置密码的令牌。如何从忘记密码中获取令牌作为响应
    猜你喜欢
    • 1970-01-01
    • 2020-11-12
    • 2017-12-19
    • 2020-04-08
    • 2015-12-23
    • 1970-01-01
    • 2018-10-20
    • 2018-08-31
    • 2018-02-25
    相关资源
    最近更新 更多