Conceber "O token de confirmação é inválido" quando o usuário se inscreve
Usando o Rails 4 e o Devise 3.1.0 no meu aplicativo da web. Eu escrevi um teste de pepino para testar a inscrição do usuário; falha quando o link "confirmar minha conta" é clicado no e-mail.
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$
Esse erro é reproduzível quando eu me inscrevo manualmente através do servidor da Web também, portanto, não parece ser um problema de Pepino.
Eu gostaria:
O usuário pode clicar com um clique para confirmar sua conta através do link deste e-mailFaça com que o usuário permaneça conectado depois de confirmar sua contaEu tenho configuração:
O último código do Devise, do GitHub (3.1.0, ref 041fcf90807df5efded5fdcd53ced80544e7430f)AUser
classe que implementaconfirmable
Usando o controlador de confirmação 'padrão' (não defini meu próprio personalizado).Eu li estas mensagens:
Devise confirmation_token é inválidoDevise 3.1: Agora com padrões mais segurosProblema do GitHub: criar um error_token inválidoE tentei:
Configuraçãoconfig.allow_insecure_tokens_lookup = true
no meu inicializador do Devise, que lança um erro de 'método desconhecido' na inicialização. Além disso, parece que isso só deve ser uma correção temporária, então eu gostaria de evitar usá-lo.Limpei meu banco de dados e comecei do zero (por isso, nenhum token antigo está presente)Atualizar:
Verificar o token de confirmação armazenado noUser
depois de se registrar. O token de emails corresponde ao token do banco de dados. De acordo com as postagens acima, o novo comportamento do Devise diz que não deveria, e que, em vez disso, deve gerar um segundo token com base no token do e-mail.Isso é suspeito. CorridaUser.confirm_by_token('[EMAIL_CONFIRMATION_TOKEN]')
devolve um utilizador com erros definidos como "@messages = {: confirmation_token => [" é inválido "]}", que parece ser a origem do problema.
Tokens incompatíveis parece ser o coração da questão; Executar o seguinte código no console para alterar manualmente o Confirmação_do usuário faz com que a confirmação seja bem-sucedida:
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
Então, por que está salvando o token de confirmação errado no DB? Eu estou usando um controlador de registro personalizado ... talvez haja algo nele que faz com que seja definido incorretamente?
routes.rb
devise_for :users,
:path => '',
:path_names => {
:sign_in => 'login',
:sign_out => 'logout',
:sign_up => 'register'
},
:controllers => {
:registrations => "users/registrations",
:sessions => "users/sessions"
}
users / 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