В настоящее время я использую это руководство , чтобы попытаться интегрировать Twitter в Devise.
Это немного сложно, потому что OAuth в твиттере не предоставляет адреса электронной почты. Следовательно, порядок регистрации должен быть:
- Пользователь нажимает кнопку «Войти через твиттер»
- Oauth, перезвоните на твиттер-звонок
- Попросить пользователя для электронной почты (мне это нужно для моего сайта)
- Войти в систему.
Я понял, что если у пользователя уже есть учетная запись в моей системе с Twitter, я должен быть в состоянии найти учетную запись. Поэтому я добавил 2 дополнительных поля в пользовательскую модель: oauth_provider, oauth_uid .
В omniauth_callbacks_controller:
def twitter
@user = User.find_for_twitter_oauth (env ["omniauth.auth"], current_user)
if @user.persisted?
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Twitter"
sign_in_and_redirect @user, :event => :authentication
else
flash[:warn] = "We still need a little more info!"
redirect_to new_user_registration_url
end
конец
In user.rb
# The trick here is that twitter does not give you an email back
# So we should make use of uid and provider
def self.find_for_twitter_oauth(oauth_hash, signed_in_resource=nil)
uid = oauth_hash['uid']
if user = User.find_by_oauth_provider_and_oauth_uid('twitter', uid)
user
else
User.create(:password => Devise.friendly_token[0,20],
:oauth_provider => "twitter",
:oauth_uid => oauth_hash['uid'])
end
end
Однако я тщательно отладил это и понял, что если я перенаправлю пользователя на new_registration_url, то пользователь, созданный в user.rb, будет стерт.
Как мне сделать следующее:
- Если пользователь не может быть найден через oauth_provider и oauth_uid, создайте объект User с этими учетными данными
- прямой пользователь new_registration_url
- Когда пользователь отправит свою электронную почту, создайте пользователя с тем же объектом пользователя, созданным в 1)
Я пытался использовать сессию, но она становится очень грязной, так как мне приходится обезьяна исправлять новинки devise и создавать для registrationscontroller.rb.
Пожалуйста, кто-нибудь, предоставьте мне способ сделать это.
Я пока не добился успеха. Позвольте мне показать вам, что я написал.