Laravel Email Verification 5.7 с использованием REST API

1

Как переделать Laravel 5.7 Проверка электронной почты для Rest API?

Или стоит делать все с нуля?

  • 0
    Я реализовал раздел вашего кода и заметил, что вы используете POST-маршруты вместо GET? Электронная почта отправляет параметры как GET, и в этом случае генерируется исключение неизвестного метода.
  • 0
    Я не помню, почему я это сделал. Я переделал свой вопрос в ответ и изменил маршруты. Спасибо!
Теги:
email
email-verification

2 ответа

2
Лучший ответ

Этот случай работает для меня. Полный код проекта здесь.

1) Переработан контроллер VerificationController

Удалены переадресации и сделаны response()->json(...).

<?php

namespace App\Http\Controllers\API\Auth;

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

class VerificationController extends Controller
{
    use VerifiesEmails;

    /**
     * Show the email verification notice.
     *
     */
    public function show()
    {
        //
    }

    /**
     * Mark the authenticated user email address as verified.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function verify(Request $request)
    {
        // ->route('id') gets route user id and getKey() gets current user id() 
        // do not forget that you must send Authorization header to get the user from the request
        if ($request->route('id') == $request->user()->getKey() &&
            $request->user()->markEmailAsVerified()) {
            event(new Verified($request->user()));
        }

        return response()->json('Email verified!');
//        return redirect($this->redirectPath());
    }

    /**
     * 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');
//        return back()->with('resent', true);
    }

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('signed')->only('verify');
        $this->middleware('throttle:6,1')->only('verify', 'resend');
    }
}

2) Добавлено мое уведомление:

Я сделал так, чтобы ссылка в сообщении электронной почты привела к моему интерфейсу и содержала ссылку requestSignedRoute для запроса.

use Illuminate\Auth\Notifications\VerifyEmail as VerifyEmailBase;

class VerifyEmail extends VerifyEmailBase
{
//    use Queueable;

    /**
     * Get the verification URL for the given notifiable.
     *
     * @param  mixed  $notifiable
     * @return string
     */
    protected function verificationUrl($notifiable)
    {
        $prefix = config('frontend.url') . config('frontend.email_verify_url');
        $temporarySignedURL = URL::temporarySignedRoute(
            'verification.verify', Carbon::now()->addMinutes(60), ['id' => $notifiable->getKey()]
        );

        // I use urlencode to pass a link to my frontend.
        return $prefix . urlencode($temporarySignedURL);
    }
}

3) Добавлена настройка frontend.php:

return [
    'url' => env('FRONTEND_URL', 'http://localhost:8080'),
    // path to my frontend page with query param queryURL(temporarySignedRoute URL)
    'email_verify_url' => env('FRONTEND_EMAIL_VERIFY_URL', '/verify-email?queryURL='),
];

4) Добавлен в модель пользователя:

use App\Notifications\VerifyEmail;

а также

/**
 * Send the email verification notification.
 *
 * @return void
 */
public function sendEmailVerificationNotification()
{
    $this->notify(new VerifyEmail); // my notification
}

5) Добавлены маршруты

В Laravel используются следующие маршруты:

// Email Verification Routes...
Route::get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
Route::get('email/verify/{id}', 'Auth\VerificationController@verify')->name('verification.verify');
Route::get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');

Они добавляются в приложение, если используются Auth::routes(); ,

Насколько я понимаю, email/verify маршрута и его метод в контроллере не нужны для Rest API.

6) На моей странице frontend /verify-email (из конфигурации frontend.php) я делаю запрос на адрес, содержащийся в параметре queryURL

Полученный URL-адрес выглядит следующим образом:

"http://localhost:8000/api/email/verify/6?expires=1537122891&signature=0e439ae2d511f4a04723a09f23d439ca96e96be54f7af322544fb76e3b39dd32"

Мой запрос (с заголовком авторизации):

await this.$get(queryURL) // typical get request

Код отлично проверяет электронную почту, и я могу поймать ошибку, если она уже проверена. Также я могу успешно отправить сообщение по электронной почте.

Я где-то ошиблась? Также я буду признателен, если вы что-то улучшите.

  • 0
    Привет;) Я новичок в программировании API, и мне просто интересно, действительно ли это спокойно, если у вас есть auth () -> user ()?
  • 0
    @nrkz Да! но вам все равно нужно использовать tymon/jwt-auth (например), он интегрируется со встроенной авторизацией, поэтому работает auth()->user() .
Показать ещё 2 комментария
0

Как насчет создания еще одного шаблона с NuxtJS? только что прошел ваш код, это удивительно, и я просто искал такой шаблон с Laravel 5.7! Спасибо! пальцы вверх!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню