2016-08-19 2 views
0

Я успешно реализовал oAuth с omniauth-facebook и omniauth-google, но у меня возникают трудности с внедрением omniauth-twitter, так как он не предоставляет адрес электронной почты.Rails Devise Twitter OAuth перенаправить в форму для продолжения oAuth registration

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

Вместо этого я хочу перенаправить пользователя в новую форму, где пользователю нужно только ввести новый адрес электронной почты, чтобы завершить его регистрацию oAuth, но я не уверен, как связать его с данными oAuth, чтобы завершить регистрацию поскольку я получаю ошибки, когда я отправляю форму, поскольку имя пользователя и пароль не могут быть пустыми, а только электронная почта отображается в этой форме.

CallbackController

def twitter 
     @user = User.from_omniauth(request.env["omniauth.auth"]) 
     if @user.persisted? 
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Twitter" 
      sign_in_and_redirect @user, :event => :authentication 
     else 
      session["devise.twitter_data"] = request.env["omniauth.auth"].except("extra") 
      redirect_to twitter_register_path 
     end 
    end 

twitter_register_path содержит вид, где пользователь должен заполнить его адрес электронной почты, чтобы завершить регистрацию.

пользователя Модель

def self.from_twitter_omniauth(auth,email) 
    where(provider: auth["provider"], uid: auth["uid"]).first_or_create do |user| 
     user.provider = auth["provider"] 
     user.uid = auth["uid"] 
     user.email = email 
     user.name = auth["info"]["name"] 
     user.password = Devise.friendly_token[0,20] 
     user.remote_poster_image_url = auth["info"]["image"].gsub('http://','https://') 
    end 
end 

Twitter регистрационная форма (twitter_register_path)

<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
    <%= f.input :email, required: true,label: false %> 
    </div> 

    <div class="signup"> 
    <%= f.button :submit, "Sign up",:class =>"register-button" %> 
    </div> 
<% end %> 

Даже при том, что Twitter API в последнее время позволяет приложениям запрашивать дополнительные разрешения на их электронную почту, я не уверен, о том, как это реализовать.

ответ

1

я, наконец, удалось решить это таким образом.

После того, как пользователь перенаправлен, и если это новый пользователь, мы предоставим форму TwitterForm, чтобы пользователь мог ввести электронное письмо для завершения регистрации.

Далее форма будет отправлена ​​на заказ, который мы указали, в моем случае я положил его под UsersController, который завершит процесс регистрации, используя данные сеанса Twitter и электронное письмо, которое вводит пользователь.

Вы не можете поместить действие вместе в CallbacksController из-за некоторых проблем с Devise, которые я не уверен, почему произошла ошибка.

Разрабатывают CallbacksController

def twitter 
     auth = request.env["omniauth.auth"] 
     @user = User.where(provider: auth.provider, uid: auth.uid).first_or_create 
     if @user.persisted? 
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Twitter" 
      sign_in_and_redirect @user, :event => :authentication 
     else 
      @form = TwitterForm.new 
      session["devise.twitter_data"] = request.env["omniauth.auth"].except("extra") 
      render :layout => 'none' 
     end 
    end 

UsersController

def twitter_register 
    @form = TwitterForm.new(params[:twitter_form]) 
    if @form.valid? 
     email = params[:twitter_form][:email]  
     @user = User.from_twitter_omniauth(session["devise.twitter_data"],email) 
     if @user.persisted? 
     flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Twitter" 
     sign_in_and_redirect @user, :event => :authentication 
     else 
     redirect_to register_path 
     end 
    else 
     render 'callbacks/twitter',layout: 'none' 
    end 
    end 

TwitterForm

class TwitterForm 
    include ActiveModel::Model 
    attr_accessor :email 
    validates :email, presence: true,:format => { :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/ } 
end 

Модель пользователя

def self.from_twitter_omniauth(auth,email) 
    where(provider: auth["provider"], uid: auth["uid"]).first_or_create do |user| 
     user.provider = auth["provider"] 
     user.uid = auth["uid"] 
     user.email = email 
     user.name = auth["info"]["name"] 
     user.password = Devise.friendly_token[0,20] 
     user.remote_poster_image_url = auth["info"]["image"] 
    end 
end