2013-05-07 16 views
13

Używam klejnotu omniauth-twitter, aby włączyć logowanie na Twitterze w aplikacji mojej szyny. Tu jest mój kod ...Identyfikator e-maila "omniauth-twitter" nie jest pobierany z Twittera w rubinach na szynach

gemfile -

gem 'omniauth', '~> 1.1.1' 
gem 'omniauth-twitter' 

routes.rb -

match '/auth/twitter/callback', to: 'users#twitter_login' 
match 'auth/failure', to: 'static_pages#home' 

User_controller.rb -

 def twitter_login 
     auth = request.env['omniauth.auth'] 
     authentication = Authentication.find_by_provider_and_uid(auth['provider'],auth['uid']) 
     if authentication 
      sign_in authentication.user 
      redirect_to root_url 
     else 
     if(User.where(:email => auth['extra']['raw_info']['email']).exists?) 
      flash[:notice] = "You already have account in ibetter" 
      redirect_to root_url   
     else 
      user = User.new 
      user.apply_omniauth(auth)   
      if user.save(:validate => false)  
       sign_in user   
       flash[:notice] = "Welcome to Ginfy"   
       redirect_to root_url 
      else 
       flash[:error] = "Error while creating a user account. Please try again." 
       redirect_to root_url 
      end 
      end 
     end 
    end 

session_helper.rb -

def sign_in(user) 
    cookies.permanent[:remember_token] = user.remember_token 
    self.current_user = user 
    end 

User.rb model -

before_save { |user| user.email = email.downcase } 
    def apply_omniauth(auth) 
    self.email = auth['extra']['raw_info']['email'] 
    self.name = auth['extra']['raw_info']['name'] 
    authentications.build(:provider => auth['provider'], :uid => auth['uid'], :token => auth['credentials']['token']) 
    end 

kod erb -

<%= link_to image_tag("login-twitter.png", alt: "twitter"), "/auth/twitter",:class => "popup", :"data-width" => "600", :"data-height" => "400" %> 

email id nie jest pobierany z Twittera. Pomóż nam

+0

Użyłem pry do debugowania podobnego problemu. Dodaj gem "pry", a następnie dodaj 'binding.pry' tuż przed miejscem, w którym spodziewasz się, że identyfikator e-maila zostanie pobrany z Twittera. Następnie możesz sprawdzić odpowiedź ze Twittera i dowiedzieć się, co się dzieje. http://yorickpeterse.com/articles/debugging-with-pry/ powinien pomóc w rozpoczęciu pracy. –

+0

dzięki za komentarz, "podważ" niesamowity klejnot do debugowania. Teraz pokazuje tak: [1] podrzędny (# )> self.email = auth ['extra'] ['raw_info'] ['email'] => zero '' [2] pry (# )> self .name = auth ['extra'] ['raw_info'] ['name'] => "Ginfy" ' – SoftwareGeek

+0

[sprawdź to] (http://stackoverflow.com/questions/3599621/is-there-a-way -to-get-an-users-email-id-po-weryfikacja-her-twitter-identity-us) – SoftwareGeek

Odpowiedz

14

Twitter nie dostarczy Ci e-maila za pośrednictwem interfejsu API.

Działa to, jeśli używasz klejnotu typu omniauth-facebook, ale twitter nie oferuje Ci wiadomości e-mail - musisz utworzyć obejście.

Na przykład poproś użytkownika w drugim kroku o wpisanie swojego adresu e-mail.

+5

Zajmowałem się tym przez autopopulowanie wiadomości e-mail jako "#{twitter_nickname}@przyklad.org" i zmianę użytkownika w czasie wolnym. –

+0

Hej Tom, obecnie mam ten sam problem. Czy mógłbyś udostępnić swój kod na temat automatycznego wypełniania wiadomości e-mail? –

+0

Dodałbym haczyk before_create i ustawię ich e-mail. – Mattherick

0

Działa dobrze, ale problem jest Twitter nie return email z jakiegoś powodu. w przeciwieństwie do facebook ..

+0

Jeśli zaktualizujesz uprawnienia na Twitterze i nadal nie otrzymujesz pola adresu e-mail w haśle OmniAuth, musisz zaktualizować tokeny uwierzytelnienia na Twitterze, aby uzyskać dodatkowe parametry. – ZombieBsAs

4

Przyjęta odpowiedź jest nieaktualna. Twitter wysyła teraz e-mail za pośrednictwem tego Special Permission Form. Wypełnij formularz z prośbą o specjalne uprawnienia i poczekaj na zatwierdzenie.

Możesz również zobaczyć this answer, aby uzyskać więcej informacji.

Powiązane problemy