[英]Devise + Omniauth + Twitter. How to get user information?
I'm trying to create a system that allows user to signup using Twitter. 我正在尝试创建一个允许用户使用Twitter进行注册的系统。 I was following this tutorial: 我正在关注本教程:
http://www.orhancanceylan.com/rails-twitter-and-facebook-authentications-with-omniauth-and-devise/ http://www.orhancanceylan.com/rails-twitter-and-facebook-authentications-with-omniauth-and-devise/
Now I'm stuck in the Twitter's callback action. 现在,我陷入了Twitter的回调操作中。 I've checked if there's already an authentication and if the user is already logged and this methods should work fine, now I'm creating the "new user" action, that should create both authentication and user. 我已经检查了是否已经有身份验证,是否已经登录了用户,并且此方法应该可以正常工作,现在我正在创建“新用户”操作,该操作应同时创建身份验证和用户。
I want the user to click on "Login with Twitter" button, then the script should get Name, Username, Bio and Location from Twitter's callback. 我希望用户单击“使用Twitter登录”按钮,然后该脚本应从Twitter的回调中获取“名称”,“用户名”,“生物”和“位置”。 Then the user should be redirected to a "2nd step page" where it should provide an e-mail and a password to complete the registration. 然后,应将用户重定向到“第二步页面”,在该页面中应提供电子邮件和密码以完成注册。
In my authentication controller I wrote this: 在我的身份验证控制器中,我这样写:
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?
I've already tried redirecting to new_user_registration_path
as it says the tutorial but then I get the original signup form. 我已经尝试过重定向到new_user_registration_path
因为它说的是教程,但随后我得到了原始的注册表单。 I created a different view with only e-mail and password fields but my big question is: 我仅使用电子邮件和密码字段创建了一个不同的视图,但我的主要问题是:
How can I get Twitter user's information and pass this data to the create
method of Devise controller? 如何获取Twitter用户信息并将此数据传递给Devise控制器的create
方法?
@khanh 's answer is slightly wrong: I don't have enough reputations to comment so I'll post it here, sorry @khanh的回答略有错误:我没有足够的声誉来发表评论,所以我将在这里发布,对不起
uid can be get in that way(@khanh), but nickname should be in this way uid可以通过这种方式获取(@khanh),但是昵称应该采用这种方式
puts env['omniauth.auth']['info']['name']
The ['info'] Hash include these: ['info']哈希包括以下内容:
description
, description
email
(which is nil
in twitter), email
(在Twitter中nil
), image
(profile image link), image
(个人资料图片链接), location
, location
, name
(user's name of twitter), name
(Twitter用户名), nickname
(@username), nickname
(@username), urls
(Hash of URLs). urls
( urls
哈希)。 The whole ['omniauth.auth']
looks like this: 整个['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"
>
so you can get the username from 这样您就可以从
env['omniauth.auth']['extra']['raw_info']['name']
env['omniauth.auth']['extra']['raw_info']['screen_name']
too. 太。 I'm not sure which (from ['info']
and ['raw_info']
) is the better way to go. 我不确定哪个(来自['info']
和['raw_info']
)是更好的方法。 But ['raw_info']
seems to give us more information than the former does. 但是['raw_info']
似乎['raw_info']
提供了更多信息。
EDIT: yeah-yeah-yeah, it was all written in the wiki! 编辑:是的,所有的内容都写在Wiki中!
Auth Hash Schema - intridea/omniauth Wiki | 验证哈希模式-intridea / omniauth Wiki | Github Github上
But there's no concrete case for Twitter, so maybe my answer is useful after all ! 但是Twitter没有具体的案例,所以也许我的回答毕竟有用! :) :)
You can do it with the following steps: 您可以按照以下步骤操作:
devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }
users/omniauth_callbacks_controller.rb : 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
To redirect the user to another form to input their email, we can sign them up using this method. 要将用户重定向到其他表单以输入他们的电子邮件,我们可以使用此方法进行注册。
After the user is redirected and if it's a new user, we will render a form TwitterForm
for the user to input an email to complete the registration. 重定向用户后(如果是新用户),我们将呈现一个TwitterForm
表单,供用户输入电子邮件以完成注册。
Next, the form will be submitted to a custom action that we specified, in my case I put it under UsersController
that'll complete the sign up process using the Twitter session data and the email that the user inputted. 接下来,表单将提交给我们指定的自定义操作,在我的案例中,我将其放在UsersController
下,它将使用Twitter会话数据和用户输入的电子邮件完成注册过程。
Devise CallbacksController 设计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 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.