Invincible me
Invincible me

Reputation: 211

How can i call laravel passport's forgot password and verify api with angular 8?

i'm trying to implement the verify email and forgot password in angular 8 with laravel passport but i can't find their api's.

I wrote few api's manually , but these won't work.

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

Does anyone know how can i do this?

Upvotes: 3

Views: 12537

Answers (2)

Parth Kharecha
Parth Kharecha

Reputation: 6503

api.php

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

AuthAPIController

Don't forget to import this tinks

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

Forgot Password method

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);
}

Reset Password method

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);
}

Upvotes: 6

Bimal Prasad Pandey
Bimal Prasad Pandey

Reputation: 581

in your api.php add these routes,

// 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');

In ForgetPasswordController add this,

<?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;
    }
}

Create a trait SendsPasswordResetEmails, and add code like below. in App\Http\Traits\SendsPasswordResetEmails location you can create where you like.

<?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 is sth like this,

<?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");

    }
}

finally your create verify method in VerificationController, it looks like

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");

    }

*Namespaces may be different and controller or method may be different in your code. Rest of logic will be same.

Upvotes: 5

Related Questions