it-swarm.com.de

Laravel Email Verification 5.7 mit REST API

Wie kann ich Laravel 5.7 Email Verification for Rest API neu erstellen?

Oder lohnt es sich, alles von Grund auf neu zu machen?

Dieser Fall funktioniert bei mir. Vollständiger Projektcode hier .

1) Überarbeiteter VerificationController Controller

Weiterleitungen entfernt und response()->json(...) Antworten gemacht.

<?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) Meine Benachrichtigung hinzugefügt:

Ich habe es so gemacht, dass der Link in der E-Mail-Nachricht zu meinem Frontend führte und einen temporarySignedRoute-Link für die Anfrage enthielt.

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) Konfiguration hinzugefügt 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) Zum Benutzermodell hinzugefügt:

use App\Notifications\VerifyEmail;

und

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

5) Routen hinzugefügt

Die folgenden Routen werden in Laravel verwendet:

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

Sie werden der Anwendung hinzugefügt, wenn Auth::routes(); verwendet wird.

Soweit ich weiß, werden die Route email/verify Und ihre Methode im Controller für die Rest-API nicht benötigt.

6) Auf meiner Frontend-Seite /verify-email (Von frontend.php Config) stelle ich eine Anfrage an die im Parameter queryURL enthaltene Adresse

Die erhaltene URL sieht folgendermaßen aus:

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

Meine Anfrage (mit Authorization Header):

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

Der Code verifiziert die E-Mail perfekt und ich kann den Fehler abfangen, wenn er bereits verifiziert wurde. Außerdem kann ich die Nachricht erfolgreich an die E-Mail senden.

Habe ich irgendwo einen Fehler gemacht? Auch ich werde dankbar sein, wenn Sie etwas verbessern.

Ich habe versucht, Илья Зеленько zu antworten, aber ich muss die VerificationController-Konstruktionsmethode wie folgt ändern

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

andernfalls laravel benötigen eine Authentifizierung, um auf die verifizierten Routen zuzugreifen und diese erneut zu senden

0
Giacomo