【问题标题】:Devise + Omniauth + Twitter. How to get user information?设计 + Omniauth + Twitter。如何获取用户信息?
【发布时间】:2013-04-01 00:19:58
【问题描述】:

我正在尝试创建一个允许用户使用 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 方法?

【问题讨论】:

    标签: ruby-on-rails twitter devise


    【解决方案1】:

    @khanh 的回答有点错误:我没有足够的声誉来发表评论,所以我会在这里发布,对不起

    uid可以这样获取(@khanh),但是昵称应该这样获取

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

    ['info'] 哈希包括这些:

    • description,
    • email(在推特上是nil),
    • image(头像链接),
    • location,
    • name(推特用户名),
    • nickname(@username),
    • 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'] 似乎比前者给了我们更多的信息。


    编辑:是的,是的,是的,都是在维基上写的!

    Auth Hash Schema - intridea/omniauth Wiki | Github

    但 Twitter 没有具体案例,所以也许我的回答毕竟是有用的! :)

    【讨论】:

      【解决方案2】:

      您可以通过以下步骤来做到这一点:

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

      users/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   
      

      【讨论】:

        【解决方案3】:

        要将用户重定向到另一个表单以输入他们的电子邮件,我们可以使用此方法注册。

        用户被重定向后,如果是新用户,我们会渲染一个表单TwitterForm,供用户输入邮箱完成注册。

        接下来,表单将提交给我们指定的自定义操作,在我的例子中,我将它放在UsersController 下,这将使用 Twitter 会话数据和用户输入的电子邮件完成注册过程。

        Full answer over here

        设计回调控制器

         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
        

        【讨论】:

          猜你喜欢
          • 2014-12-16
          • 2015-01-26
          • 1970-01-01
          • 2015-02-25
          • 1970-01-01
          • 1970-01-01
          • 2015-11-22
          • 2012-06-18
          • 1970-01-01
          相关资源
          最近更新 更多