Laravel 5.6 Подписанный URL-адрес недействителен после отправки пользователем формы - PullRequest
0 голосов
/ 28 февраля 2020

В моей системе, используя Laravel 5.6, мы отправляем электронное письмо со ссылкой на приглашение (используя подписанный URL), где пользователь щелкает, заполняет форму и отправляет ее на сервер. На этом этапе пользователь сохраняется.

Подписанный URL-адрес уже содержит такие данные, как электронная почта и perfil_id (например, role_id), которые будут назначены при отправке пользователем формы.

В какой момент я должен использовать метод $ request-> hasValidSignature ()? Потому что, если я подожду, пока пользователь заполнит форму и отправит запрос, вызываемый здесь метод выдаст false hasValidSignature (). Если я проверю при передаче представления для пользователя, чтобы увидеть форму, проверка пройдет, но перед отправкой формы пользователь сможет подделать данные.

Подписанный URL внутри контроллера

$url = URL::temporarySignedRoute('completar', now()->addHours(5), [
            'email' => $request->get('email'),
            'perfil_id' => $request->get('perfil_id'),
            'empresa_id' => auth()->user()->empresa_id,
        ]);


    Mail::to($request->get('email'))->send(new UserRegistrationInvite($url));

Форма внутри представления, которое пользователь должен заполнить после использования ссылки на электронную почту

<form action="{{route("aceitar")}}" method="post">
            <input type="hidden" name="email" value="{{$request['email']}}">
            <input type="hidden" name="perfil_id" value="{{$request['perfil_id']}}">
            <input type="hidden" name="empresa_id" value="{{$request['empresa_id']}}">
            <input type="hidden" name="signature" value="{{$request['signature']}}">
            <br>
            <label for="name">Digite seu nome: </label>
            <input type="text" id="Nome" name="name" placeholder="Nome">
            <br>
            <label for="password">Digite sua senha: </label>
            <input type="password" name="password" id="password">
            <br>
            <label for="password_confirmation">confirme sua senha: </label>
            <input type="password" name="password_confirmation" id="password_confirmation">
            <hr>
            <button type="submit" id="convite">Enviar</button>
        </form>

функция вызывается, когда пользователь отправляет форму. здесь проверка не удастся

public function aceitar(Request $request) {
    // verifica se a signed URL é válida
    if (!$request->hasValidSignature()) {
        abort(response()->json('URL não válida - aceitar', 403));
    }

    // ao submeter o formulario anterior, faz validação
    $validator = Validator::make($request->all(), [
        'name' => 'required',
        'perfil_id' => 'required',
        'empresa_id' => 'required',
        'email' => 'required|email',
        'password' => 'required|confirmed'
    ]);

    // se validação falhar exibe erros na tela
    if ($validator->fails()) {
        return $validator->errors();
    } else {
        // se passar na validação usuário é criado com perfil e permissões ja relacionadas
        $usuario = User::create([
                                    'email' => $request->email,
                                    'name' => $request->name,
                                    'password' => bcrypt($request->password),
                                    'empresa_id' => $request->empresa_id,
                                ]);
        $usuario->perfil()->attach($request->perfil_id);

        return 'Usuário criado com sucesso';
    }

спасибо за ваше время.

1 Ответ

0 голосов
/ 28 февраля 2020

Подпись действительна только на первом URL-адресе, который посещает пользователь: 'Completetar.

Когда они публикуют форму, эта же подпись больше не действует на маршруте' aceitar '.

Вы можете проверить подпись, даже не показав им форму, и считать ее доверенной.

Вы также можете создать другой временный подписанный URL для почтового маршрута в форме, если вы хотите добавить еще один шаг проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...