Enviar un correo para restablecer una contraseña con Flutter


Avatar de Pedro Cortez

Es importante permitir a tus usuarios cambiar su contraseña, ya sea porque la han olvidado o por razones de seguridad. En esta guía, explico cómo enviar un email de restablecimiento de contraseña a un usuario registrado en Firebase.


contraseña olvidada

¿Cómo agregar una funcionalidad de «olvidé mi contraseña» con Flutter?

El primer paso para enviar un correo de restablecimiento de contraseña a un usuario es haber configurado Firebase Auth para tu aplicación Flutter y, lógicamente, un sistema de autenticación por correo electrónico.

Aquí asumiré que ya has realizado este paso. Si no es el caso, te invito a consultar mi guía para configurar Firebase Auth en Flutter.

Este método de restablecimiento de contraseña solo funciona para los usuarios que se registraron en tu aplicación con su dirección de correo electrónico. Para los usuarios que utilizan Google Sign In, Apple, etc., las contraseñas son gestionadas por esos servicios y, por lo tanto, normalmente no tendrás acceso a ellas.

Para restablecer la contraseña de un usuario enviándole un correo electrónico, Flutter ofrece directamente una función:

await FirebaseAuth.instance.sendPasswordResetEmail(email: "el correo del usuario");

Aquí tienes un ejemplo de código que permite al usuario introducir su correo electrónico en un campo de texto para recibir un correo de restablecimiento de contraseña:

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';

class ForgotPasswordPage extends StatefulWidget {
  @override
  _ForgotPasswordPageState createState() => _ForgotPasswordPageState();
}

class _ForgotPasswordPageState extends State<ForgotPasswordPage> {
  final _emailController = TextEditingController();
  final _formKey = GlobalKey<FormState>();
  String _feedbackMessage = '';

  @override
  void dispose() {
    _emailController.dispose();
    super.dispose();
  }

  Future<void> _resetPassword() async {
    if (!_formKey.currentState!.validate()) return;

    try {
      await FirebaseAuth.instance
          .sendPasswordResetEmail(email: _emailController.text.trim());
      setState(() {
        _feedbackMessage =
            'Se ha enviado un correo de restablecimiento a tu dirección de correo electrónico.';
      });
    } catch (error) {
      setState(() {
        _feedbackMessage = 'Error: ${error.toString()}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Olvidé mi contraseña'),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                'Ingresa tu dirección de correo electrónico para recibir un enlace de restablecimiento de contraseña.',
                style: TextStyle(fontSize: 16),
              ),
              SizedBox(height: 20),
              TextFormField(
                controller: _emailController,
                keyboardType: TextInputType.emailAddress,
                decoration: InputDecoration(
                  labelText: 'Correo electrónico',
                  border: OutlineInputBorder(),
                ),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Por favor, ingresa una dirección de correo electrónico';
                  }
                  if (!RegExp(r'^[^@]+@[^@]+\.[^@]+').hasMatch(value)) {
                    return 'Por favor, ingresa una dirección de correo electrónico válida';
                  }
                  return null;
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _resetPassword,
                child: Text('Enviar'),
              ),
              SizedBox(height: 20),
              if (_feedbackMessage.isNotEmpty)
                Text(
                  _feedbackMessage,
                  style: TextStyle(
                    color: Colors.red,
                  ),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

Personalizar el correo de restablecimiento

Puedes personalizar el correo de restablecimiento accediendo a la consola de Firebase, en la sección de Autenticación, luego en Modelos de correo electrónico. Solo queda adaptar el modelo de tu correo según la identidad visual de tu aplicación.

Avatar de Pedro Cortez