3

我正在尝试创建一个允许用户使用 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 用户的信息并将这些数据传递给createDevise 控制器的方法?

4

3 回答 3

1

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

uid 可以通过这种方式获得(@khanh),但昵称应该是这种方式

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

['info'] 哈希包括:

  • description,
  • emailnil在推特上),
  • image(个人资料图片链接),
  • location,
  • name(推特用户名),
  • nickname(@用户名),
  • 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 没有具体案例,所以也许我的回答毕竟是有用的!:)

于 2016-01-23T12:18:50.160 回答
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   
于 2014-01-21T14:28:58.650 回答
0

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

用户被重定向后,如果是新用户,我们将呈现一个表单TwitterForm供用户输入电子邮件以完成注册。

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

完整答案在这里

设计回调控制器

 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

用户控制器

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
于 2016-08-20T10:09:15.590 回答