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;
});
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ónVerifyEmail::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
: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ámetroclient
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ámetroclient
.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.