3

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?

2 Answers 2

6

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);
}
Sign up to request clarification or add additional context in comments.

3 Comments

you might need php artisan make:notification ResetPassword
Also old code from Laravel versions might work if you use composer require laravel/ui
where do u get token for reset password. How to get token from forget password as response
5

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.

5 Comments

that doesn't work, I'm getting Route [password.reset] not defined.
@guilhermevictorramalhonatal you need first run these 3 commands to install the Laravel's laravel/ui package to auth: 1 - composer require laravel/ui, 2 - php artisan ui vue --auth, 3 - php artisan migrate
@FellipeSanches I'm using react
@guilhermevictorramalhonatal Ok, but you need the Laravel laravel/ui package to fix password.reset] not defined.
to resolve the [password.reset] issue, you need to name the route as mentioned in this link: stackoverflow.com/a/45157498/529151

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.