web-dev-qa-db-fra.com

Laravel Email Verification 5.7 en utilisant REST API

Comment refaire Laravel 5.7 Vérification des e-mails pour l'API Rest?

Ou vaut-il la peine de tout faire à partir de zéro?

Cette affaire fonctionne pour moi. Code de projet complet ici .

1) Refonte VerificationController contrôleur

Suppression des redirections et réponses 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's 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) Ajout de ma notification:

J'ai fait en sorte que le lien dans le message électronique mène à mon frontend et contienne un lien temporaireSignedRoute pour la demande.

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) Ajout de la configuration 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) Ajouté au modèle utilisateur:

use App\Notifications\VerifyEmail;

et

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

5) Itinéraires ajoutés

Les itinéraires suivants sont utilisés à 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');

Ils sont ajoutés à l'application s'ils sont utilisés Auth::routes();.

Pour autant que je sache, la route email/verify Et sa méthode dans le contrôleur ne sont pas nécessaires pour l'API Rest.

6) Sur ma page frontend /verify-email (Depuis la configuration frontend.php) Je fais une demande à l'adresse contenue dans le paramètre queryURL

L'URL reçue ressemble à ceci:

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

Ma demande (avec en-tête d'autorisation):

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

Le code vérifie parfaitement l'e-mail et je peux attraper l'erreur s'il a déjà été vérifié. Je peux également renvoyer le message avec succès par e-mail.

Ai-je fait une erreur quelque part? Je serai également reconnaissant si vous améliorez quelque chose.

J'ai essayé la réponse de Илья Зеленько mais je dois modifier la méthode de construction de VerificationController comme suit

public function __construct()
{
    $this->middleware('auth')->except(['verify','resend']);
    $this->middleware('signed')->only('verify');
    $this->middleware('throttle:6,1')->only('verify', 'resend');
}

sinon laravel nécessite une authentification pour accéder aux routes de vérification et de renvoi

0
Giacomo