Reputation: 211
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
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
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