Laravel Passport отправляет «Неаутентифицированный» только при проверке писем - PullRequest
0 голосов
/ 21 октября 2019

Я работаю над своим проектом, и у меня проблема с API. Система регистрации и входа работает очень хорошо. У меня есть подробный маршрут, где я могу получить информацию о текущем пользователе. Это означает, что приложение может видеть, что пользователь аутентифицирован и действует правильно.

Я начал работать над проверкой электронной почты (и, честно говоря, было довольно сложно заставить все работать должным образом). Письмо отправлено правильно, но у меня возникла проблема со ссылкой. Когда я нажимаю на него в сообщении электронной почты, я получаю сообщение о том, что маршрут не существует (что является нормальным, поскольку я нахожусь на API). Однако, когда я добавляю заголовок «Принять» для application / json и заголовок «Авторизация», я получаю сообщение «Неаутентифицировано», даже если пользователь аутентифицирован должным образом.

Маршруты:

Auth::routes(['verify' => true]);

Route::post('login', 'UserController@login');
Route::post('register', 'UserController@register');

Route::group(['middleware' => 'auth:api'], function() {
    Route::post('details', 'UserController@details');
});

Модель пользователя:

<?php

namespace App;

use App\Notifications\VerifyEmail;
use Laravel\Passport\HasApiTokens;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable, HasApiTokens;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'firstname', 'lastname', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function sendEmailVerificationNotification()
    {
        $this->notify(new VerifyEmail);
    }

Контроллер регистра:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request; 
use App\Http\Controllers\Controller; 
use App\User; 
use Illuminate\Support\Facades\Auth; 
use Validator;

class UserController extends Controller
{
    public $successStatus = 200;

    public function login() {
        if(Auth::attempt(['email' => request('email'), 'password' => request('password')])) {
            $user = Auth::user();
            $success['token'] = $user->createToken('MyApp')->accessToken;
            return response()->json(['success' => $success], $this->successStatus);
        }
        else {
            return response()->json(['error' => 'Unauthorised'], 401);
        }
    }

    public function register(Request $request) {
        $validator = Validator::make($request->all(), [
            'firstname' => 'required',
            'lastname' => 'required',
            'email' => 'required|email|unique:users',
            'password' => 'required', 
            'c_password' => 'required|same:password'
        ]);

        if($validator->fails()) {
            return response()->json(['error' => $validator->errors()], 401);
        }

        $input = $request->all();
        $input['password'] = bcrypt($input['password']);
        $user = User::create($input);
        $success['token'] =  $user->createToken('MyApp')-> accessToken; 
        $success['name'] =  $user->name;
        $user->sendEmailVerificationNotification();
        return response()->json(['success' => $success], $this->successStatus);
    }

    public function details() 
    { 
        $user = Auth::user(); 
        return response()->json(['success' => $user], $this->successStatus); 
    } 
}

Контроллер проверки:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\VerifiesEmails;

class VerificationController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Email Verification Controller
    |--------------------------------------------------------------------------
    |
    | This controller is responsible for handling email verification for any
    | user that recently registered with the application. Emails may also
    | be re-sent if the user didn't receive the original email message.
    |
    */

    use VerifiesEmails;

    /**
     * Where to redirect users after verification.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * 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');
    }
}

Уведомление о подтверждении по электронной почте:

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

class VerifyEmail extends \Illuminate\Auth\Notifications\VerifyEmail
{
    /**
     * Build the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {
        $verificationUrl = $this->verificationUrl($notifiable);

        if (static::$toMailCallback) {
            return call_user_func(static::$toMailCallback, $notifiable, $verificationUrl);
        }

        return (new MailMessage)
            ->subject(('Vérification de l\'addresse email'))
            ->line(('Veuillez cliquer sur le bouton ci-dessous pour vérifier votre addresse email.'))
            ->action(('Vérifier mon addresse email'), $verificationUrl)
            ->line(('Si vous n\'avez pas créé de compte, vous n\'avez rien à faire de plus.'));
    }

}

1 Ответ

1 голос
/ 21 октября 2019

Вы можете увидеть в конструкторе VerificationController, там есть $this->middleware('auth');. Вы должны изменить его на auth:api.

Но , проверка загружается браузером. Он не должен использовать api guard, он должен быть web (поведение по умолчанию). Сначала необходимо войти в систему, используя обычный метод входа (не через API), поскольку API работает не так.

Правильный вариант использования, только что помещен Auth::routes(['verify' => true]); в routes/web.php.

...