2013-04-09 50 views
2

我正在尝试创建一个允许用户使用Twitter注册的系统。我下面这个教程:Devise + Omniauth + Twitter。如何获取用户信息?

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

现在我被困在Twitter的回调动作。我检查了是否已经有身份验证,如果用户已经登录,并且此方法应该可以正常工作,现在我正在创建“新用户”操作,该操作应该同时创建身份验证和用户。

我希望用户点击“登录与Twitter”按钮,然后脚本应该从Twitter的回调得到名称,用户名,生物和位置。然后用户应该被重定向到“第二步页面”,在那里它应该提供一个电子邮件和一个密码来完成注册。

在我的认证控制器我写这样的:

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用户的信息并将此数据传递给Devise控制器的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(URL的哈希)。

整个['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']似乎给了我们比前者更多的信息。


编辑:是啊,是啊,是的,它全部写在维基上!

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 
相关问题