Devise + Omniauth + Twitter。如何获取用户信息?
我正在尝试创建一个允许用户使用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
方法?
您可以通过以下步骤来做到:
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
@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的,所以也许我的答案毕竟是很有用的! :)
要将用户重定向到其他表单以输入他们的电子邮件,我们可以使用此方法对其进行签名。
用户重定向后,如果是新用户,我们将呈现一个表格TwitterForm
供用户输入电子邮件以完成注册。
接下来,表单将被提交给我们指定的自定义操作,在我的情况下,我将其置于UsersController
之下,使用Twitter会话数据和用户输入的电子邮件完成注册过程。
设计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