2013-04-09 7 views
2

Я пытаюсь создать систему, которая позволяет пользователю регистрироваться с помощью Twitter. Я следовал этому учебнику:Devise + Omniauth + Twitter. Как получить информацию о пользователе?

http://www.orhancanceylan.com/rails-twitter-and-facebook-authentications-with-omniauth-and-devise/

Теперь я застрял в обратном вызове действия в Твиттере. Я проверил, есть ли уже аутентификация, и если пользователь уже зарегистрирован, и эти методы должны работать нормально, теперь я создаю действие «нового пользователя», которое должно создавать как аутентификацию, так и пользователя.

Я хочу, чтобы пользователь нажал кнопку «Войти с помощью Twitter», тогда сценарий должен получить имя, имя пользователя, био и местоположение из обратного вызова Twitter. Затем пользователь должен быть перенаправлен на страницу «2-го шага», где он должен предоставить электронное письмо и пароль для завершения регистрации.

В моем контроллере аутентификации я написал:

user = User.new 

    user.name = omni['info'].name 
    user.username = omni['info'].nickname 
    user.location = omni['info'].location 
    user.bio = omni['info'].description 

    user.apply_omniauth omni 
    user.avatar_from_url omni['info'].image 

    session[:omniauth] = omni.except('extra') 

    #What should I do here? 

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

Как я могу получить информацию о пользователе Twitter и передать эти данные методу Dev12a create?

ответ

0

Вы можете сделать это с помощью следующих шагов:

devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } 

пользователей/omniauth_callbacks_controller.rb:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def twitter 
    # show twitter account information 
    puts env['omniauth.auth']['uid'] 
    puts puts env['omniauth.auth']['nickname'] 
    end 
end 
1

ответ @khanh «ы немного неправильно: у меня нет достаточно репутация для комментариев, поэтому я отправлю его здесь, извините

uid можно получить таким образом (@khanh), но прозвище должно быть таким образом

puts env['omniauth.auth']['info']['name'] 

Сеть [ 'Информация'] Хэш включают в себя следующие:

  • description,
  • email (который nil в твиттере),
  • image (профиль ссылка на изображение),
  • location,
  • name (имя пользователя твиттер),
  • nickname (@username),
  • urls (Hash of URLs).

Вся ['omniauth.auth'] выглядит следующим образом:

#<OmniAuth::AuthHash 
    credentials=#<OmniAuth::AuthHash 
        secret="some-secret-xxxxxxxxxxxxxxxxxxxxxx" 
        token="some-token-xxxxxxxxxxxxxxxxxxxxxx" 
    > 
    extra=#<OmniAuth::AuthHash 
      access_token=#<OAuth::AccessToken:0x0055cab742d2b8 
          @token="some-token-xxxxxxxxxxxxxxxxxxxxxx", 
          @secret="some-secret-xxxxxxxxxxxxxxxxxxxxxx", 
          @consumer=#<OAuth::Consumer:0x0055cab760ba58 
              @key="some-consumer-key-xxxxxxxxxxxxxx", 
              @secret="some-consumer-secret-xxxxxxxxxxxxxx", 
              @options={ 
              :signature_method=>"HMAC-SHA1", 
              :request_token_path=>"/oauth/request_token", 
              :authorize_path=>"/oauth/authenticate", 
              :access_token_path=>"/oauth/access_token", 
              :proxy=>nil, 
              :scheme=>:header, 
              :http_method=>:post, 
              :oauth_version=>"1.0", 
              :site=>"https://api.twitter.com" 
              }, 
              @http=#<Net::HTTP api.twitter.com:443 open=false>, 
              @http_method=:post, 
              @uri=#<URI::HTTPS https://api.twitter.com> 
          >, 
          @params={ 
           :oauth_token=>"some-token-xxxxxxxxxxxxxxxxxxxxxx", 
           "oauth_token"=>"some-token-xxxxxxxxxxxxxxxxxxxxxx", 
           :oauth_token_secret=>"some-secret-xxxxxxxxxxxxxxxxxxxxxx", 
           "oauth_token_secret"=>"some-secret-xxxxxxxxxxxxxxxxxxxxxx", 
           :user_id=>"000000000", 
           "user_id"=>"000000000", 
           :screen_name=>"sample_user", 
           "screen_name"=>"sample_user", 
           :x_auth_expires=>"0", 
           "x_auth_expires"=>"0" 
          }, 
          @response=#<Net::HTTPOK 200 OK readbody=true> 
      > 
      raw_info=#<OmniAuth::AuthHash 
         contributors_enabled=false 
         created_at="Fri Sep 02 23:56:11 +0000 2011" 
         default_profile=false 
         default_profile_image=false 
         description="Hi my name is Sample and I'm a Twitter user." 
         entities=#<OmniAuth::AuthHash 
            description=#<OmniAuth::AuthHash 
                urls=[] 
            > 
            url=#<OmniAuth::AuthHash 
              urls=[ 
               #<OmniAuth::AuthHash 
               display_url="link.to/my/blog_or_someth…" 
               expanded_url="http://link.to/my/blog_or_something.html" 
               indices=[0, 23] 
               url="https://t.co/SAMPLE007" 
               > 
              ] 
            > 
         > 
         favourites_count=690 
         follow_request_sent=false 
         followers_count=42 
         following=false 
         friends_count=34 
         geo_enabled=false 
         has_extended_profile=false 
         id=000000000 
         id_str="000000000" 
         is_translation_enabled=false 
         is_translator=false 
         lang="ja" 
         listed_count=24 
         location="Tokyo, Japan" 
         name="Sample user" 
         notifications=false 
         profile_background_color="DBE9ED" 
         profile_background_image_url="http://abs.twimg.com/images/themes/theme17/bg.gif" 
         profile_background_image_url_https="https://abs.twimg.com/images/themes/theme17/bg.gif" 
         profile_background_tile=false 
         profile_banner_url="https://pbs.twimg.com/profile_banners/0000000000/00000000000" 
         profile_image_url="http://pbs.twimg.com/profile_images/010101010101010101/LeoGT5Xu_normal.png" 
         profile_image_url_https="https://pbs.twimg.com/profile_images/010101010101010101/LeoGT5Xu_normal.png" 
         profile_link_color="CC3366" 
         profile_sidebar_border_color="DBE9ED" 
         profile_sidebar_fill_color="E6F6F9" 
         profile_text_color="333333" 
         profile_use_background_image=true 
         protected=false 
         screen_name="sample_user" 
         statuses_count=61468 
         time_zone="Tokyo" 
         url="https://t.co/SAMPLE007" 
         utc_offset=32400 
         verified=false 
      > 
    > 
    info=#<OmniAuth::AuthHash::InfoHash 
      description="Hi my name is Sample and I'm a Twitter user." 
      email=nil 
      image="http://pbs.twimg.com/profile_images/010101010101010101/LeoGT5Xu_normal.png" 
      location="Tokyo, Japan" 
      name="Sample User" 
      nickname="sample_user" 
      urls=#<OmniAuth::AuthHash 
        Twitter="https://twitter.com/sample_user" 
        Website="https://t.co/SAMPLE007"> 
    > 
    provider="twitter" 
    uid="000000000" 
> 

так что вы можете получить имя пользователя из

env['omniauth.auth']['extra']['raw_info']['name'] 
env['omniauth.auth']['extra']['raw_info']['screen_name'] 

тоже. Я не уверен, что (от ['info'] и ['raw_info']) - лучший способ пойти. Но ['raw_info'], похоже, дает нам больше информации, чем первая.


EDIT: да-да-да, все было написано на wiki!

Auth Hash Schema - intridea/omniauth Wiki | Github

Но нет никакого конкретного случая для Twitter, так что, может быть, мой ответ полезен в конце концов! :)

0

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

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

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

Full answer over here

Разрабатывают 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 
Смежные вопросы