2

I can not successfully confirm my user. Many posts have been made about an invalid token but most of them were due to the changes from Devise 2 to Devise 3. That is not my issue.

I over rid my user confirmation using https://github.com/plataformatec/devise/wiki/How-To:-Override-confirmations-so-users-can-pick-their-own-passwords-as-part-of-confirmation-activation

app/controllers/confirmations_controller.rb

class ConfirmationsController < Devise::ConfirmationsController
  # Remove the first skip_before_filter (:require_no_authentication) if you
  # don't want to enable logged users to access the confirmation page.
  skip_before_filter :require_no_authentication
  skip_before_filter :authenticate_user!

  # PUT /resource/confirmation
  def update
    with_unconfirmed_confirmable do
      if @confirmable.has_no_password?
        @confirmable.attempt_set_password(params[:user])
        if @confirmable.valid?
          do_confirm
        else
          do_show
          @confirmable.errors.clear #so that we wont render :new
        end
      else
        self.class.add_error_on(self, :email, :password_already_set)
      end
    end

    if !@confirmable.errors.empty?
      render 'devise/confirmations/new' #Change this if you don't have the views on default path
    end
  end

  # GET /resource/confirmation?confirmation_token=abcdef
  def show
    with_unconfirmed_confirmable do
      if @confirmable.has_no_password?
        do_show
      else
        do_confirm
      end
    end
    if !@confirmable.errors.empty?
      self.resource = @confirmable
      render 'devise/confirmations/new' #Change this if you don't have the views on default path 
    end
  end

  protected

  def with_unconfirmed_confirmable
    original_token = params[:confirmation_token]
    confirmation_token = Devise.token_generator.digest(User, :confirmation_token, original_token)
    @confirmable = User.find_or_initialize_with_error_by(:confirmation_token, confirmation_token)
    if !@confirmable.new_record?
      @confirmable.only_if_unconfirmed {yield}
    end
  end

  def do_show
    @confirmation_token = params[:confirmation_token]
    @requires_password = true
    self.resource = @confirmable
    render 'devise/confirmations/show' #Change this if you don't have the views on default path
  end

  def do_confirm
    @confirmable.confirm!
    set_flash_message :notice, :confirmed
    sign_in_and_redirect(resource_name, @confirmable)
  end
end

The HTML that is sent to the user for confirmation in the email is

<%= link_to 'Confirm', confirmation_url(@resource, :confirmation_token => @token) %>

The problem I am having is that initially the user is being sent to the show page since I by-passed the need for a password and no confirmation is made but no error is shown.

  # GET /resource/confirmation?confirmation_token=abcdef
  def show
    with_unconfirmed_confirmable do
      if @confirmable.has_no_password?
        do_show
      else
        do_confirm
      end
    end

When I removed the if statement to leave only

  # GET /resource/confirmation?confirmation_token=abcdef
  def show
    with_unconfirmed_confirmable do
      do_confirm
    end

The user is now sent to the confirmation New page but with the error

Confirmation token is invalid

My routes are

  as :user do
      patch '/user/confirmation' => 'confirmations#update', :via => :patch, :as => :update_user_confirmation
  end

devise_for :users, :controllers => { :confirmations => "confirmations", registrations: "registrations" } 

devise_scope :user do
  authenticated :user do
    root :to => 'devise/sessions#destroy', as: :authenticated_root
  end
  unauthenticated :user do
    root :to => 'devise/registrations#new', as: :unauthenticated_root
  end
end

Why is this token not working correctly?

MicFin
  • 2,431
  • 4
  • 32
  • 59
  • 1
    I am having the same error! Mine is particularly strange because the confirmation works and the user is prompted to sign in. Then, when they sign in, they are sent to the new confirmation page with the error Confirmation token is invalid. WTH! Note that devise still lets them log in. That error is so strange since it doesn't stop the login process at all, and it occurs after they sign in, not when they click the link in the email. – light24bulbs May 07 '14 at 00:28
  • Do you still have this problem? What does your log show (including user creation and confirmation)? – Tim Jul 29 '14 at 18:40
  • Did anyone figure out the issue here? – Stone Sep 08 '14 at 06:32
  • Did you figure out this problem? – Chris Hough Oct 29 '14 at 05:21

0 Answers0