Как реализовать функцию обязательной проверки электронной почты Laravel при регистрации API? - PullRequest
0 голосов
/ 30 мая 2019

Я реализовал интерфейс MustVerifyEmail в моей пользовательской модели

class User extends Authenticatable implements MustVerifyEmail

, также я сделал VerificationApi Controller

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Foundation\Auth\VerifiesEmails;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\Verified;

class VerificationApiController extends Controller
{
    use VerifiesEmails;

    * Mark the authenticated user’s email address as verified.

    *

    * @param \Illuminate\Http\Request $request

    * @return \Illuminate\Http\Response

    */

    public function verify(Request $request) {

    $userID = $request['id'];

    $user = User::findOrFail($userID);

    $date = date("Y-m-d H:i:s");

    $user->email_verified_at = $date; // to enable the “email_verified_at field of that user be a current time stamp by mimicing the must verify email feature

    $user->save();

    return response()->json('Email verified!');

    }

    /**

    * Resend the email verification notification.

    *

    * @param \Illuminate\Http\Request $request

    * @return \Illuminate\Http\Response

    */

    public function resend(Request $request)

    {

    if ($request->user()->hasVerifiedEmail()) {

    return response()->json('User already have verified email!', 422);

    // return redirect($this->redirectPath());

    }

    $request->user()->sendEmailVerificationNotification();

    return response()->json('The notification has been resubmitted');

    }
}

, и я сделал

<?php

namespace App\Notifications;

use Illuminate\Support\Carbon;

use Illuminate\Support\Facades\URL;

use Illuminate\Auth\Notifications\VerifyEmail as VerifyEmailBase;

class VerifyApiEmail extends VerifyEmailBase

{

/**

* Get the verification URL for the given notifiable.

*

* @param mixed $notifiable

* @return string

*/

protected function verificationUrl($notifiable)

{

return URL::temporarySignedRoute(

'verificationapi.verify', Carbon::now()->addMinutes(60), ['id' => $notifiable->getKey()]

); // this will basically mimic the email endpoint with get request

}

}

в моем API.php-файл, который я добавил

Route::get('email/verify/{id}', 'VerificationApiController@verify')->name('verificationapi.verify');

Route::get('email/resend', 'VerificationApiController@resend')->name('verificationapi.resend');

Так что, когда я регистрируюсь в своем API, я получаю письмо с подтверждением в своем почтовом ящике, и когда я нажимаю кнопку, он говорит, что мой адрес электронной почты подтвержден, и в моей базе данных он меняется с нуля на email_verified_at2019-05-27 13:04:20 но когда я ставлю промежуточное ПО («проверено») на мои маршруты и когда я вхожу в систему с пользователем, которого я зарегистрировал в своем почтальоне, я получаю


    "message": "Your email address is not verified.",
    "exception": "Symfony\\Component\\HttpKernel\\Exception\\HttpException",

мой регистр ()) и функции login () выглядят так:

 public function register(Request $request, User $user)
    {
        $phoneRegex = "(06|387)[0-9]{7,8}";
        $request->validate([
            'first_name' => 'required|string',
            'last_name' => 'required|string',
            'email' => 'required|string|email|unique:users',
            'password' => 'required|string|confirmed',
            'phone_number' => 'required|string|min:6',

        ]);
        $user = new User([
            'first_name' => $request->first_name,
            'last_name' => $request->last_name,
            'email' => $request->email,
            'password' => bcrypt($request->password),
            'phone_number' => $request['phone_number'],
        ]);
        $user->save();

            Auth::login($user,true);
            $user->sendApiEmailVerificationNotification();

            $success['message'] = 'Please confirm yourself by clicking on verify user button sent to you on your email';

            return response()->json(['success'=>$success], $this->successStatus);
}
public function login(Request $request)
    {
        $request->request->add([
            'client_id' => env("PASSPORT_CLIENT_ID"),
            'client_secret' => env("PASSPORT_CLIENT_SECRET"),
            'grant_type' => 'password',
            'scope' => '',
        ]);
        $tokenRequest = $request->create('/oauth/token', 'POST', $request->all());
        $response = Route::dispatch($tokenRequest);

        return $response;
    }

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 30 мая 2019

Я только что добавил это в свою функцию login (), и теперь она выглядит следующим образом

public function login(Request $request)
    {
        $request->request->add([
            'client_id' => env("PASSPORT_CLIENT_ID"),
            'client_secret' => env("PASSPORT_CLIENT_SECRET"),
            'grant_type' => 'password',
            'scope' => '',
        ]);
        $tokenRequest = $request->create('/oauth/token', 'POST', $request->all());
        $response = Route::dispatch($tokenRequest);

        $user = User::where('email', $request->username)->first();

        if($user->email_verified_at !== NULL){
            $success['message'] = "Login successfull";
            return $response;
            }else{
            return response()->json(['error'=>'Please Verify Email'], 401);
            }
    }

, и теперь, если вы не подтвердили свою электронную почту, вы не можете войти, она не дает вам доступ иобновите токен, но мне не нужно использовать промежуточное ПО («проверено») на моих маршрутах, поэтому, если у кого-то еще есть лучшее решение, я был бы признателен.

...