Подписание маршрута PHP laravel не работает в почтальоне? ⇐ Php
Подписание маршрута PHP laravel не работает в почтальоне?
Версия Laravel: 10.10
Привет, я использую леса laravel Breeze для аутентификации пользователя. Система проверки электронной почты Laravel Breeze по умолчанию регистрирует пользователя и входит в систему, затем пользователь может проверить свою электронную почту, но моему приложению необходимо проверить электронную почту, а затем аутентифицировать пользователя. Я создал новую базу данных, которая содержит непроверенные пользователи и в основном похожие столбцы, которые есть у пользователя моего приложения.
Schema::create('unverified_users', function (Blueprint $table) { $таблица->id(); $table->string('имя'); $table->string('фамилия', 30); $table->string('электронная почта'); $table->enum('role', ['member', 'admin'])->default('member'); $table->string('телефон', 20)->nullable(false); //$table->timestamp('email_verified_at')->nullable(); $table->string('пароль'); //$table->rememberToken(); $таблица->временные метки(); }); Я изменил некоторые классы формирования шаблонов и переопределил некоторые методы для работы этой логики, и в конечном итоге все работает так, как задумано.
Метод регистрации пользователя
хранилище общедоступных функций (Запрос $request): Ответ { $request->проверить([ 'name' => ['обязательный', 'строка', 'макс.:255'], 'фамилия' => ['обязательно', 'строка', 'макс.:255'], 'телефон' => ['обязательно', 'строка', 'макс.: 255'], 'email' => ['обязательный', 'строка', 'строчные буквы', 'email', 'max:255', 'unique:'.User::class], 'пароль' => ['требуется', 'подтверждено', Правила\Пароль::defaults()], ]); /** @var UnverifiedUsers $user */ $user = UnverifiedUsers::create($request->all()); событие (новый зарегистрированный ($ пользователь)); $user->sendEmailVerificationNotification(); //отправляет электронное письмо вернуть ответ()->noContent(); } Метод проверки электронной почты пользователя публичная функция __invoke(Request $request): RedirectResponse { $requestUserId = $request->route('id'); $unverifiedUser = UnverifiedUsers::find($requestUserId); //TODO: вернуть более приятное сообщение если(! $unverifiedUser){ выдать новое исключение AuthorizationException; } if (! hash_equals((string) $unverifiedUser->id, (string) $requestUserId)) { выдать новое исключение AuthorizationException; } if (! hash_equals(sha1($unverifiedUser->getEmailForVerification()), (строка) $request->route('hash'))) { выдать новое исключение AuthorizationException; } UnverifiedUsers::where('email', $unverifiedUser->email)->delete(); $user = новый пользователь([ 'имя' => $unverifiedUser->имя, 'фамилия'=> $unverifiedUser->фамилия, 'email'=> $unverifiedUser->электронная почта, 'телефон' => $unverifiedUser->телефон, ]); $user->пароль = $unverifiedUser->пароль; $пользователь->сохранить(); если ($user->markEmailAsVerified()) { событие (новый проверенный ($ запрос-> пользователь ())); } return redirect()->away(config('app.frontend_url').RouteServiceProvider::HOME.'?verified=1'); } и, конечно же, необходимое промежуточное ПО для проверки электронной почты
//маршрут, который проверяет URL для проверки электронной почты Route::get('/verify-email/{id}/{hash}', VerifyEmailController::class) ->middleware(['signed', 'throttle:6,1']) //здесь подписанное промежуточное ПО ->name('verification.verify'); Основная проблема (или это не проблема) заключается в том, что когда я отправляю URL-адрес для проверки электронной почты пользователю, если пользователь использует то же устройство, которое создало серверную часть для отправки электронной почты, тогда, когда пользователь делает запрос на получение, используя URL-адрес проверки, проблем не возникает. но всякий раз, когда я использую браузер для отправки электронной почты и использую почтальона для проверки URL-адреса, я получаю неверную ошибку подписи. ПОЧЕМУ?
Я немного обнаружил исходный код и обнаружил, что ValidateSignature, который является промежуточным программным обеспечением по умолчанию в laravel, которое обрабатывает подписи маршрутов, обрабатывает подписи следующим образом:
дескриптор публичной функции ($request, Closure $next, ...$args) { [$relative, $ignore] = $this->parseArguments($args); if ($request->hasValidSignatureWhileIgnoring($ignore, ! $relative)) { вернуть $next($request); } создать новое исключение InvalidSignatureException; } Это именно тот момент, когда я получаю ошибку «Неверная подпись». Когда я проверяю метод hasValidSignatureWhileIgnoring:
Request::macro('hasValidSignatureWhileIgnoring', function ($ignoreQuery = [], $absolute = true) { URL возврата::hasValidSignature($this, $absolute, $ignoreQuery); }); Похоже, что это макрос и этот код находится в FoundationServiceProvider.php. И что здесь происходит? когда я просматриваю подписанный маршрут, я вижу, что он просто использует ключ приложения для создания подписанных маршрутов, я никогда не видел, чтобы он использовал сеанс или что-то подобное.
РЕДАКТИРОВАТЬ:
Я проверил URL-адрес подтверждения в другом браузере, и он работал нормально. Похоже, в почтальоне возникла проблема.
Версия Laravel: 10.10
Привет, я использую леса laravel Breeze для аутентификации пользователя. Система проверки электронной почты Laravel Breeze по умолчанию регистрирует пользователя и входит в систему, затем пользователь может проверить свою электронную почту, но моему приложению необходимо проверить электронную почту, а затем аутентифицировать пользователя. Я создал новую базу данных, которая содержит непроверенные пользователи и в основном похожие столбцы, которые есть у пользователя моего приложения.
Schema::create('unverified_users', function (Blueprint $table) { $таблица->id(); $table->string('имя'); $table->string('фамилия', 30); $table->string('электронная почта'); $table->enum('role', ['member', 'admin'])->default('member'); $table->string('телефон', 20)->nullable(false); //$table->timestamp('email_verified_at')->nullable(); $table->string('пароль'); //$table->rememberToken(); $таблица->временные метки(); }); Я изменил некоторые классы формирования шаблонов и переопределил некоторые методы для работы этой логики, и в конечном итоге все работает так, как задумано.
Метод регистрации пользователя
хранилище общедоступных функций (Запрос $request): Ответ { $request->проверить([ 'name' => ['обязательный', 'строка', 'макс.:255'], 'фамилия' => ['обязательно', 'строка', 'макс.:255'], 'телефон' => ['обязательно', 'строка', 'макс.: 255'], 'email' => ['обязательный', 'строка', 'строчные буквы', 'email', 'max:255', 'unique:'.User::class], 'пароль' => ['требуется', 'подтверждено', Правила\Пароль::defaults()], ]); /** @var UnverifiedUsers $user */ $user = UnverifiedUsers::create($request->all()); событие (новый зарегистрированный ($ пользователь)); $user->sendEmailVerificationNotification(); //отправляет электронное письмо вернуть ответ()->noContent(); } Метод проверки электронной почты пользователя публичная функция __invoke(Request $request): RedirectResponse { $requestUserId = $request->route('id'); $unverifiedUser = UnverifiedUsers::find($requestUserId); //TODO: вернуть более приятное сообщение если(! $unverifiedUser){ выдать новое исключение AuthorizationException; } if (! hash_equals((string) $unverifiedUser->id, (string) $requestUserId)) { выдать новое исключение AuthorizationException; } if (! hash_equals(sha1($unverifiedUser->getEmailForVerification()), (строка) $request->route('hash'))) { выдать новое исключение AuthorizationException; } UnverifiedUsers::where('email', $unverifiedUser->email)->delete(); $user = новый пользователь([ 'имя' => $unverifiedUser->имя, 'фамилия'=> $unverifiedUser->фамилия, 'email'=> $unverifiedUser->электронная почта, 'телефон' => $unverifiedUser->телефон, ]); $user->пароль = $unverifiedUser->пароль; $пользователь->сохранить(); если ($user->markEmailAsVerified()) { событие (новый проверенный ($ запрос-> пользователь ())); } return redirect()->away(config('app.frontend_url').RouteServiceProvider::HOME.'?verified=1'); } и, конечно же, необходимое промежуточное ПО для проверки электронной почты
//маршрут, который проверяет URL для проверки электронной почты Route::get('/verify-email/{id}/{hash}', VerifyEmailController::class) ->middleware(['signed', 'throttle:6,1']) //здесь подписанное промежуточное ПО ->name('verification.verify'); Основная проблема (или это не проблема) заключается в том, что когда я отправляю URL-адрес для проверки электронной почты пользователю, если пользователь использует то же устройство, которое создало серверную часть для отправки электронной почты, тогда, когда пользователь делает запрос на получение, используя URL-адрес проверки, проблем не возникает. но всякий раз, когда я использую браузер для отправки электронной почты и использую почтальона для проверки URL-адреса, я получаю неверную ошибку подписи. ПОЧЕМУ?
Я немного обнаружил исходный код и обнаружил, что ValidateSignature, который является промежуточным программным обеспечением по умолчанию в laravel, которое обрабатывает подписи маршрутов, обрабатывает подписи следующим образом:
дескриптор публичной функции ($request, Closure $next, ...$args) { [$relative, $ignore] = $this->parseArguments($args); if ($request->hasValidSignatureWhileIgnoring($ignore, ! $relative)) { вернуть $next($request); } создать новое исключение InvalidSignatureException; } Это именно тот момент, когда я получаю ошибку «Неверная подпись». Когда я проверяю метод hasValidSignatureWhileIgnoring:
Request::macro('hasValidSignatureWhileIgnoring', function ($ignoreQuery = [], $absolute = true) { URL возврата::hasValidSignature($this, $absolute, $ignoreQuery); }); Похоже, что это макрос и этот код находится в FoundationServiceProvider.php. И что здесь происходит? когда я просматриваю подписанный маршрут, я вижу, что он просто использует ключ приложения для создания подписанных маршрутов, я никогда не видел, чтобы он использовал сеанс или что-то подобное.
РЕДАКТИРОВАТЬ:
Я проверил URL-адрес подтверждения в другом браузере, и он работал нормально. Похоже, в почтальоне возникла проблема.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Получить параметры URL-адреса из маршрута без указания маршрута @page - Blazor
Anonymous » » в форуме C# - 0 Ответы
- 125 Просмотры
-
Последнее сообщение Anonymous
-