es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Laravel – Dominio alternativo raíz en el enlace de correo electrónico de verificación.

Tengo una aplicación de Laravel a la que se puede acceder desde múltiples clientes, cada uno con su propio dominio (por ejemplo, myclient.com). Además, hay un cliente principal (para el ejemplo, utilizando el dominio coreclient.org).

Los usuarios asociados al cliente principal pueden registrarse en otros clientes.

Los usuarios administradores de cualquier otro cliente solo pueden registrar usuarios en su propio cliente.

Esto utiliza el código base de Fortify.

Todo está bien hasta que llega el correo electrónico de verificación de cuenta cuando el cliente principal crea un usuario nuevo para otro cliente. El enlace en el correo electrónico de verificación utiliza el dominio del cliente principal en lugar del cliente al que pertenece el nuevo usuario.

Por ejemplo, http://coreclient.org/email/verify/1/dd8…8ad?expires=1639608547&signature=718…1ee.

Debería ser http://myclient.com/email/verify/1/dd8…8ad?expires=1639608547&signature=718…1ee.

Para solucionar esto, reemplacé el dominio en la cadena de la URL después de generarse, pero esto causa una firma no válida, asumiendo que se genera en función del dominio de la persona que crea el nuevo usuario.

Esto es lo que tengo hasta ahora en la función boot de mi archivo AuthServiceProvider… ¿alguna idea?

VerifyEmail::createUrlUsing(function ($notifiable) {

    $verifyUrl = URL::temporarySignedRoute(
        'verification.verify',
        Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
        [
            'id' => $notifiable->getKey(),
            'hash' => sha1($notifiable->getEmailForVerification()),
        ]
    );

    // Esto modifica el dominio en la URL si el usuario del cliente principal crea para otro cliente, pero genera una firma no válida
    if(auth()->user()->client->is_core && auth()->user()->client_id != $notifiable->client_id) {
        $verifyUrl = Str::replace(auth()->user()->client->domains->first()->domain, $notifiable->client->domains->first()->domain, $verifyUrl);
    }

    return $verifyUrl;
});
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para la verificación de correo electrónico en la aplicación Laravel

    El problema con el correo electrónico de verificación de cuenta de la aplicación Laravel, que utiliza el dominio principal del cliente en lugar del cliente al que pertenece el nuevo usuario, se puede solucionar modificando el archivo AuthServiceProvider. Podemos actualizar la función VerifyEmail::createUrlUsing para generar la URL de verificación en función del cliente al que pertenece el nuevo usuario, y también manejar el caso en el que un usuario principal del cliente está creando un nuevo usuario para un cliente diferente.

    Aquí está la implementación actualizada para la función VerifyEmail::createUrlUsing:

    VerifyEmail::createUrlUsing(function ($notifiable) {
    
        $client = $notifiable->client;
    
        $verifyUrl = URL::temporarySignedRoute(
            'verification.verify',
            Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
            [
                'id' => $notifiable->getKey(),
                'hash' => sha1($notifiable->getEmailForVerification()),
                'client' => $client->id
            ]
        );
    
        // Verificar si el usuario que crea al nuevo usuario es un usuario principal del cliente
        if(auth()->user()->client->is_core && auth()->user()->client_id != $client->id) {
    
            // Obtener el dominio para el cliente del nuevo usuario
            $domain = $client->domains->first()->domain;
            $query = parse_url($verifyUrl, PHP_URL_QUERY);
    
            // Reemplazar el dominio en la URL con el dominio del cliente
            $verifyUrl = preg_replace("/(\/|\?)client=(\d+)/", "", $verifyUrl);
            $verifyUrl .= (parse_url($verifyUrl, PHP_URL_QUERY) ? '&' : '?') . 'client=' . $client->id;
            $verifyUrl = Str::replace(parse_url($verifyUrl, PHP_URL_HOST), $domain, $verifyUrl);
        }
    
        return $verifyUrl;
    });
    

    En esta implementación, estamos obteniendo el cliente para el nuevo usuario e incluyendo su ID en la consulta de la URL, junto con el ID de usuario y el hash. También manejamos el caso en el que el usuario que crea al nuevo usuario es un usuario principal del cliente, reemplazando el dominio en la URL con el dominio del cliente y agregando el ID del cliente a la consulta de la URL.

    Ten en cuenta que estamos utilizando una expresión regular para eliminar cualquier parámetro de consulta client existente antes de agregar el nuevo parámetro client a la consulta de la URL. Esto es para manejar el caso en el que un usuario está volviendo a enviar un correo electrónico de verificación para un nuevo usuario, ya que la URL existente ya contendría un parámetro client.

    Esta implementación actualizada debería solucionar el problema de generar la URL de verificación correcta para nuevos usuarios en una aplicación Laravel con múltiples clientes.

Comments are closed.