2014-02-26 20 views
4

因此,Devise 3.1現在將摘要標記存儲在數據庫中。我用的是保持令牌發送跟進電子郵件給註冊用戶,如果用戶沒有確認他的電子郵件呢,我會追加與令牌鏈接:從Devise 3中的用戶資源獲取確認url

Please confirm your account etc. 
www.example.com?confirmation_token=<%= user.confirmation_token %> 

的問題是現在user.confirmation_token已加密,並且我無法使用@token var,因爲此操作不是來自Devise Controller。

最終,我需要一種方法來從用戶資源中檢索正確的確認URL,而無需通過Devise Controller。

有沒有辦法做到這一點?

編輯:

,因爲沒有一個清晰的方式來做到這一點,現在,我打開了進一步的想法在設計的Github上的問題:

https://github.com/plataformatec/devise/issues/2903

+0

@ AnnArbor87:請不要編輯帖子以添加「random backticks」。反引號通常只能用於*在線程序代碼。在這個問題中,*應該擁有它們的唯一短語是「@ token」(你確實修復了)和'user.confirmation_token'(你沒有這樣做)。但是,「設計3.1」和「設計控制器」不是*程序代碼,不應該有反引號。 –

回答

3

這取決於當你正在發送電子郵件。如果您在發送常用確認電子郵件的同時進行此操作(因此,在與創建用戶時相同的執行循環內),您應該可以通過將此標記添加到用戶模型中來訪問令牌:

def get_raw_confirmation_token 
    return @raw_confirmation_token 
end 

如果您在稍後的時間點發送後續電子郵件,您將無法檢索現有的確認令牌。爲安全起見,它作爲單向散列存儲在數據庫中。但是,您可以執行的操作是生成新的確認標記,然後將其發送到您的後續電子郵件中。添加一個新的方法,以您的用戶模型是這樣的:

def generate_new_confirmation_token 
    unless @raw_confirmation_token 
    generate_confirmation_token! 
    end 
    return @raw_confirmation_token  
end 

這會取消舊的令牌,但它可以讓你嵌入新到電子郵件中。 Devise還可以重新發送舊的確認電子郵件,只需在用戶對象上撥打resend_confirmation_instructions,電子郵件將被重新發送 - 如果確認標記已過期,它將爲您生成一個新電子郵件。

+0

從安全的角度來看,這聽起來很合理,但從用戶的角度來看這很糟糕。我有客戶點擊舊的激活鏈接,只是爲了接收不再有效的消息。因此,用戶會嘗試重新發送說明,並在第二天再次打開他的電子郵件。如果在此期間發送了跟進,則會再次使指令無效,直到用戶簡單地放棄並離開。我不認爲這種額外的安全性會彌補這樣一個事實,即我可能因爲無法確認帳戶而導致用戶流失...... – eMgz

+0

是的,這是非常難以精確定位的折中之一。您可以通過將config.confirm_within值設置爲devise.rb初始化程序中更長的時間(例如2天)來延長確認期,這會讓您的用戶有更多時間來確認帳戶。 –