Cuando se crea un sistema de login con Devise todo funciona perfecto salido de la caja excepto el recuperar contraseñas, la razón es muy sencilla, esto se hace via email y para que rails pueda enviar un email necesita tener un sender (enviador) configurado, este modulo en rails 4 recibe el nombre de
Action Mailer.

Configurando action_mailer para enviar correos con gmail

para hacerlo basta abrir el archivo de configuración config/application.rb (también es posible ocupar un initializer) y agregar las siguientes líneas dentro del module y de class Application.


    config.action_mailer.default_url_options = { :host => 'localhost:3000' }
    config.action_mailer.delivery_method = :smtp
    config.action_mailer.perform_deliveries = true
    config.action_mailer.raise_delivery_errors = true
    config.action_mailer.default :charset => "utf-8"
  
    ActionMailer::Base.smtp_settings = {
      :address => "smtp.gmail.com",
      :port => 587,
      :authentication => :plain,
      :domain => 'gmail.com',
      :user_name => ENV['email'],
      :password => ENV['email_password'],
    }

donde dice ENV[‘email’] y password podemos cambiarlas por nuestras claves de email y al reiniciar la aplicación ya estaría funcionando pero hay un problema grande con hacer eso, estaríamos dejando las claves del correo electrónico dentro de nuestro código.

Además hoy en día gmail no soporta utilizar el password directamente desde una aplicación, para crear un password exclusivo para nuestra app debemos ir a: https://security.google.com/settings/security/apppasswords y crear un passowrd para nuestra aplicación.

Protegiendo las claves con dot-env

Dot-env es una gema que nos permite agregar variables de entorno de forma sencilla a nuestra aplicación, para eso vamos agregar la siguiente gema al gemfile

gem 'dotenv-rails'

luego tenemos que crear un archivo .env (si, el punto es parte del nombre) dentro de la raíz de nuestro proyecto, en el vamos a agregar las variables de entorno.


[email protected] 
email_password=tuppassword

y ya con eso nuestra aplicación permite recuperar las claves del usuario desde el sign_in.

Evitando adjuntar el archivo .env por error al repositorio

Ahora debemos de asegurarnos de no adjuntar este archivo por error cuando hagamos un commit, para eso vamos a abrir el archivo .gitignore (esto sólo aplica si están ocupando GIT)


/.env

Configurando Heroku para que acepte las variables de entorno

Si ocupas Heroku te estarás preguntando como pasar el archivo .env si no está en el repositorio, el secreto es que no se pasa, vamos a ocupar la terminal para dar los valores de las variables de entorno.

Entonces desde la terminal dentro de la carpeta del proyecto, escribimos:


heroku config:set [email protected]
heroku config:set email_password=tupassword

y ahora si que si, tus claves están seguras y tu aplicación está funcionando con la opción de recuperar contraseñas.