2014-02-03 4 views
2

Иногда письма с подтверждением подписки наших пользователей повесили трубку, и мне нужно создать ссылку для подтверждения, чтобы отправить их вручную. Я схватил код с точкой зрения почты DEViSE, но связь она порождает не то же самое, что получает генерируется автоматически генерируемое подтверждение по электронной почте:Создание ссылки для подтверждения Devise

код с точкой зрения подтверждения мэйлера DEViSE в:

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

Пример подтверждение связь :
http://myapp.com/confirmation?confirmation_token=dTDYagcDbfJehEJPThRi

код, я использую в пользовательском генераторе ссылок подтверждения:

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

Пример ссылка для подтверждения (В отличие от выше- не работает):
http://myapp.com/confirmation?confirmation_token=162baabc80329f01209297af8c49a42e1fdf9066ffef412322b509bc5967052d

Как создать ссылку с подтверждением DEViSE?

ответ

3

Это связано с тем, что относительно недавно (3.1+ я думаю?) Повышена безопасность, зашифровав токены (включая токен подтверждения), прежде чем хранить их в базе данных. Таким образом, второй длинный токен - это зашифрованная версия первого, более короткого токена и, следовательно, не будет работать. Единственное место, где токен подтверждения существует в незашифрованном виде, находится в исходном электронном письме, отправленном пользователю.

Это означает, что новый токен должен быть сгенерирован каждый раз, когда для пользователя отправляется электронное письмо с подтверждением. Разработчик может разрешить пользователям запрашивать другое электронное письмо с подтверждением (ConfirmationsController) - вы отключили это? Он называет send_confirmation_instructionsкласса метод на классе пользователя (который в Confirmable модуле Разрабатывают и в свою очередь, вызывает в конечном итоге вызова resend_confirmation_instructions, который вызывает send_confirmation_instructionsэкземпляра метод, который может генерировать новый маркер). Вероятно, вы могли бы называть метод классом на свой пользовательский класс самостоятельно, но было бы проще разрешить пользователям запрашивать другое подтверждение по электронной почте, используя стандартное приложение ConfirmationsController и маршруты/представления.

+0

@ отсчет Спасибо за пояснение.Проблема в том, что иногда наши пользователи не могут получить доступ к автогенерированным электронным письмам из нашей системы (из-за проблем с доставкой через определенные интернет-провайдеры), что означает, что никакие электронные письма с подтверждением, будь то автоматические или возмущенные, могут пройти. В тех случаях мы ищем способ создать ссылку подтверждения и отправить ее альтернативными средствами. Я посмотрю в источнике send_confirmation_instructions и посмотрю, смогу ли я выбрать способ сделать это ... будет обновлять ... – Yarin

+0

Ах. В этом случае generate_token в Confirmable - это то, что генерирует и сохраняет новый токен подтверждения. Он оставляет @raw_confirmation_token в экземпляре, который передается шаблону электронной почты. Возможно, вам повезло. Остерегайтесь возможного взаимодействия с повторно подтвержденным (хотя и не уверенным), если у вас есть это. – Tim

+0

10 4 попробуем, спасибо за помощь! – Yarin

0

Альтернатива, если вы просто хотите REDIRECT пользователя после нажатия подтверждения, просто

ШАГА 1 переопределять значение after_confirmation_path_for в вашем confirmations_controller:

Создать новый confirmations_controller.rb в каталог приложений/контроллеров:

class ConfirmationsController < Devise::ConfirmationsController 
    private 
    def after_confirmation_path_for(resource_name, resource) 
    your_new_after_confirmation_path 
end 
end 

STEP 2 В config/routes.rb добавьте эту строку, чтобы Devise будет использовать ваш пользовательский ConfirmationsController. Это предполагает, что Devise работает с таблицей пользователей (вы можете редактировать ее в соответствии с вашим).

devise_for :users, controllers: { confirmations: 'confirmations' } 

ШАГ 3 Перезагрузите веб-сервер

Смежные вопросы