2013-08-22 12 views
8

Moja User.rb:Devise confirmation_token jest nieprawidłowy

class User < ActiveRecord::Base 

    devise :database_authenticatable, :registerable,:confirmable,:token_authenticatable, 
    :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:name] 

Moje trasy:

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

Moja ConfirmationsController to standardowy kontroler, ale z innego przekierowania.

mam link na mój e-mail, takich jak:

/users/confirmation?confirmation_token=167bad44a15e02b0bd570b51e1bf927b88368d8855d92b9833a24017a2bad4be 

W użytkownika bazy danych ma

confirmation_token:167bad44a15e02b0bd570b51e1bf927b88368d8855d92b9833a24017a2bad4be 

ale po kliknięciu na ten link i tylko patrz strona z:

Resend confirmation instructions 
Confirmation token is invalid 

Czego nie robię - co jeszcze muszę ustawić.

CONFIRMATIONCONTROLLER:

def resource_params 
params.require(:user).permit(:confirmation_token) 
    end 
    private :resource_params 


    def show 
self.resource = resource_class.confirm_by_token(params[:confirmation_token]) 

if resource.errors.empty? 
    set_flash_message(:notice, :confirmed) if is_navigational_format? 
    sign_in(resource_name, resource) 
    session['new_user'] = true 
    respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) } 
else 
    respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new } 
end 
    end 

    protected 
    # The path used after resending confirmation instructions. 
    def after_resending_confirmation_instructions_path_for(resource_name) 
     new_registration_path(resource_name) 
    end 

mówię „standardowy kontroler”, ponieważ kiedy go usunąć i nie używać niestandardowych kontrolera problemu jest to, że samo.

+0

Po przesłaniu "standardowego" zastąpionego kodu kontrolera. – TheIrishGuy

+0

i? Czy jest jakiś błąd lub co ... zmieniam tokena na abcde w bazie danych iw adresie URL - i nic się nie zmieni – Wordica

+0

To może nie rozwiązać całego problemu, ale jeśli po prostu chcesz przekierować na inną ścieżkę, nie powinieneś kopiować/wklej całą metodę. Powinieneś nadpisać chronioną metodę 'after_confirmation_path_for', aby zwrócić wybraną ścieżkę. –

Odpowiedz

17

Którą wersję urządzenia używasz? Jeśli jesteś na 3.1.0 lub wyższym, oczekuje się, że takie zachowanie:

CHANGELOG.md

Tokeny, które są przechowywane w bazie danych nie mają dopasować znaki, które wysyłają w potwierdzeniu e-mail. Zobacz devise/lib/devise/models/confirmable.rb, która obecnie zawiera następujące elementy:

def confirm_by_token(confirmation_token) 
    original_token  = confirmation_token 
    confirmation_token = Devise.token_generator.digest(self, :confirmation_token, confirmation_token) 

    confirmable = find_or_initialize_with_error_by(:confirmation_token, confirmation_token) 

Jak widać, token, które przechodzą w za pośrednictwem string zapytanie params jest konsumowanych przez Devise.token_generator, a wynik tej operacji jest to, co w porównaniu z tokena w baza danych, aby odkryć rekord użytkownika.

Wygląda na to, że to chwilowo możliwe (ale nie w 3.1 3.2), aby to wyłączyć przez ustawienie

config.allow_insecure_token_lookup = true 

w opracować inicjatora. Ale domyślne zachowanie zostało zmienione, aby zapewnić lepsze zabezpieczenie. Zobacz this blog post, aby uzyskać pełny przegląd ulepszeń w zakresie bezpieczeństwa w wersji 3.1, w tym tej zmiany.

+0

Według cytowanego bloga ta poprawka będzie dostępna tylko tymczasowo (http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more- secure-defaults /). Jakie jest trwałe rozwiązanie? –

+0

To nie jest poprawka, to obejście dla osób, które aktualizują ze starszych wersji. Możesz nie chcieć wdrożenia z Devise 3.1, aby unieważnić istniejące tokeny potwierdzające, które powinny być prawidłowe. Jeśli twoja aplikacja dostosowała potwierdzenie tak, aby nie działała z Devise> = 3.1, "poprawka" ma sprawić, by działała z nowymi, zaszyfrowanymi tokenami. Ponieważ oznacza to rezygnację lub ponowne wprowadzanie dostosowań, nie wchodzi to w zakres tego pytania. Mogę tylko wyjaśnić, co robią w 3.1 i dlaczego. – gregates

5

Możesz użyć poniższego rozwiązania (ustawienie config.allow_insecure_token_lookup = true), ale zgodnie z the Devise changelog, będzie ono dostępne tylko tymczasowo.

Problem prawdopodobnie pojawił się, ponieważ uruchomiłeś generator devise do zrzutu wszystkich swoich widoków na swój powrót, zanim wprowadzono te zmiany. Potem zaktualizowałeś swój klejnot Devise i wszystkie zmiany zostały zmienione, ale twoje poglądy nie. Teraz wszystkie widoki i kopie związane z programowaniem są nieaktualne i nie będą działać z nowymi stylami znaczników.

Nowe wiadomości e-mail można zobaczyć pod adresem: https://github.com/plataformatec/devise/tree/master/app/views/devise/mailer.Główną zmianą jest zmiana tej linii:

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p> 

do

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

Główną różnicą jest @resource.confirmation_token staje tylko @token.

3

Zmieniam @resource.confirmation_token na @token, a następnie zadziała.

Powiązane problemy