#ruby-on-rails #ruby #devise #omniauth
#ruby-on-rails #ruby #разработка #omniauth
Вопрос:
Я новичок в rails и пытаюсь настроить аутентификацию.
Я сделал пользовательский просмотр подтверждения по почте app/views/devise/mailer/confirmation_instructions.html.erb
следующим образом:
<p>Welcome <%= @email %>!</p>
<p>
Thanks for registering. You have registered through <%= @resource.provider %>.
The account data has been created automatically as follows:
</p>
<ul>
<li><strong>User Name:</strong> <%= @resource.name %></li>
<li><strong>Password:</strong> <%= @resource.password %></li>
</ul>
<p>You can confirm your account email through the link below:</p>
<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
@resource.provider
Возвращает строку, такую как 'facebook'
, 'twitter'
, 'github'
.
Если бы я хотел настроить эти строки, скажем, вместо print 'Facebook'
, 'Twitter'
, 'GitHub'
…, как мне это сделать? Моя первая идея — это метод
def print_cool_provider(provider)
if provider == 'facebook'
return 'Facebook'
else if ...
...
end
end
Я рассматриваю конечный короткий список возможных поставщиков, с которыми я могу обращаться один за другим. Мои настоящие вопросы больше касаются MVC, Rails и Devise:
Где я должен определить этот метод, чтобы учитывать шаблон MVC и в то же время иметь возможность вызывать его из confirmation_instructions.html.erb
шаблона?
Комментарии:
1. Если вы хотите напечатать только удобочитаемую строку (первая буква в верхнем регистре), вы можете использовать это в своих инструкциях по подтверждению:
<%= @resource.provider.humanize %>
Вы можете посмотреть здесь для получения дополнительной информации: api.rubyonrails.org/classes/String.html#method-i-humanize2. это была моя первая мысль, но я подумал, есть ли какой-нибудь лучший вариант, который больше учитывает шаблон MVC, на случай, если я захочу расширить его позже.
Ответ №1:
Вы могли бы добавить простой помощник, например:
# app/helpers/provider_helper.rb
module ProviderHelper
# only special cases, where #titlecase won't suffice
PROVIDER_NAMES = {
'github' => 'GitHub',
'google_oauth2' => 'Google'
}
def provider_name(user)
PROVIDER_NAMES[user.provider] || user.provider.titlecase
end
end
Однако лучшим подходом был бы презентатор (или декоратор).
- Draper был бы моим первым выбором
- Ruby Toolbox содержит множество альтернатив
Примечание: я бы не отправлял пароль по электронной почте, если он не зашифрован.
Комментарии:
1. При регистрации через поставщика с OAuth с помощью Devise генерируется случайный пароль. Моя идея состоит в том, чтобы отправить этот пароль пользователям по электронной почте, и таким образом они не будут вынуждены всегда входить в систему через провайдера. Однако я новичок, и я, конечно, принимаю предложения, поскольку мои идеи могут быть не всегда правильными. Вы имеете в виду, что я должен зашифровать все электронное письмо? Или, может быть, было бы достаточно отправить пароль только в том случае, если он сгенерирован devise. В любом случае, большое спасибо, я, вероятно, буду использовать presenters.
2. Я бы посоветовал вообще не отправлять пароли. Если вы шифруете почту, вам либо требуется, чтобы получатель использовал PGP (что, впрочем, неплохо), либо каким-то образом передавал ключ дешифрования, желательно также не в незашифрованном виде… С другой стороны, вся цель поставщиков OAuth заключается в том, что вам не нужно управлять n паролями, а только одним для поставщика, с помощью которого ваши пользователи будут идентифицировать себя. Если вы настаиваете на локальном пароле, сделайте его необязательным и позвольте пользователю выбрать свой собственный после первого входа в систему.
3. Хорошо, я понимаю вашу точку зрения, тогда я, вероятно, не буду использовать локальные пароли. В любом случае, докладчики восполняют недостаток, связанный с другими частями веб-приложения, поэтому Draper будет действительно полезен для меня. Еще раз спасибо!