Diseñe el "token de confirmación no es válido" cuando el usuario se registra

Uso de Rails 4 y Devise 3.1.0 en mi aplicación web. Escribí una prueba de pepino para probar el registro de usuarios; falla cuando se hace clic en el enlace "confirmar mi cuenta" desde el correo electrónico.

Scenario: User signs up with valid data                                                           # features/users/sign_up.feature:9
    When I sign up with valid user data                                                             # features/step_definitions/user_steps.rb:87
    Then I should receive an email                                                                  # features/step_definitions/email_steps.rb:51
    When I open the email                                                                           # features/step_definitions/email_steps.rb:76
    Then I should see the email delivered from "[email protected]"                                # features/step_definitions/email_steps.rb:116
    And I should see "You can confirm your account email through the link below:" in the email body # features/step_definitions/email_steps.rb:108
    When I follow "Confirm my account" in the email                                                 # features/step_definitions/email_steps.rb:178
    Then I should be signed in                                                                      # features/step_definitions/user_steps.rb:142
      expected to find text "Logout" in "...Confirmation token is invalid..." (RSpec::Expectations::ExpectationNotMetError)
     ./features/step_definitions/user_steps.rb:143:in `/^I should be signed in$

Este error es reproducible cuando también me inscribo manualmente a través del servidor web, por lo que no parece ser un problema de pepino.

Me gustaría:

El usuario podrá confirmar con un clic su cuenta a través del enlace de este correo electrónico.Haga que el usuario permanezca conectado después de confirmar su cuenta.

He configurado:

El último código de Devise, de GitHub (3.1.0, ref 041fcf90807df5efded5fdcd53ced80544e7430f)A User clase que implementaconfirmableUso del controlador de confirmación 'predeterminado' (no he definido mi propio controlador personalizado).

He leído estos posts:

La confirmación del token_token no es válidaDiseño 3.1: ahora con valores predeterminados más segurosGitHub Issue - Devise confirmation_token no válido

Y he intentado:

Ajusteconfig.allow_insecure_tokens_lookup = true en mi inicializador de Devise, que arroja un error de 'método desconocido' en el inicio. Además, parece que esto solo se supone que es una solución temporal, por lo que me gustaría evitar usarlo.Purgó mi DB y comencé desde cero (por lo que no hay tokens antiguos)

Actualizar:

Comprobando el token de confirmación almacenado en elUser después de registrarse. El token de los correos electrónicos coincide con el token DB. De acuerdo con las publicaciones anteriores, el nuevo comportamiento de Devise dice que se supone que no, y que en su lugar debe generar un segundo token basado en el token del correo electrónico.Esto es sospechoso. CorriendoUser.confirm_by_token('[EMAIL_CONFIRMATION_TOKEN]') devuelve un usuario que tiene el conjunto de errores "@messages = {: confirmation_token => [" no es válido "]}", que parece ser el origen del problema.

La falta de coincidencia de tokens parece ser el núcleo del problema; la ejecución del siguiente código en la consola para cambiar manualmente la confirmación del usuario hace que la confirmación se realice correctamente:

new_token = Devise.token_generator.digest(User, :confirmation_token, '[EMAIL_TOKEN]')
u = User.first
u.confirmation_token = new_token
u.save
User.confirm_by_token('[EMAIL_TOKEN]') # Succeeds

Entonces, ¿por qué está guardando el token de confirmación erróneo en la base de datos en primer lugar? Estoy usando un controlador de registro personalizado ... ¿tal vez haya algo en él que haga que se configure incorrectamente?

rutas.rb

  devise_for  :users,
          :path => '',
          :path_names => {
            :sign_in => 'login',
            :sign_out => 'logout',
            :sign_up => 'register'
            },
          :controllers => {
            :registrations => "users/registrations",
            :sessions => "users/sessions"
          }

usuarios / registrations_controller.rb:

class Users::RegistrationsController < Devise::RegistrationsController

  def create
    # Custom code to fix DateTime issue
    Utils::convert_params_date_select params[:user][:profile_attributes], :birthday, nil, true

    super
  end

  def sign_up_params
    # TODO: Still need to fix this. Strong parameters with nested attributes not working.
    #       Permitting all is a security hazard.
    params.require(:user).permit!
    #params.require(:user).permit(:email, :password, :password_confirmation, :profile_attributes)
  end
  private :sign_up_params
end

Respuestas a la pregunta(3)

Su respuesta a la pregunta