我想在轨道上我的手红宝石。 主要是我已经在西纳特拉编写的代码。 反正这个问题可能没有做任何事情的框架。 而这个问题可能听起来很新手的问题。 我与Twitter的API 1.1和OAuth第一次玩。
我已经创建了一个应用程序XYZ和与Twitter注册了。 我得到了XYZ的消费键即CONSUMER_KEY和消费者的秘密,即CONSUMER_SECRET。 我也得到了XYZ自己的访问令牌即ACCESS_TOKEN和访问秘密即ACCESS_SECRET
XYZ应用类型:读,写和访问直接消息XYZ回调URL: http://www.mysite.com/cback我已经检查:允许该应用程序可用于登录与Twitter
我所试图做的是非常简单的:
1)用户来我的网站,并点击一个链接Link your twitter account
(不与Twitter签到)
2)打开叽叽喳喳弹出,其中用户同意XYZ进行开/她代表他的行动
3)一旦用户许可证,并弹出被关闭,XYZ应用程序获取用户的访问令牌和秘密,并保存在数据库中。
4)然后XYZ使用该用户的令牌和秘密执行未来的行动。
我可能是个笨蛋,这样的工作流程已经在数千网站和Twitter的API实现单证解释这个三足式身份验证,还是我无法弄清楚。
我已阅读https://dev.twitter.com/docs/auth/3-legged-authorization和https://dev.twitter.com/docs/auth/implementing-sign-twitter遗憾的是没有Ruby代码互联网上发现,一步一步的示例说明。
哪些环节应该被用来打开Twitter的认证页面,当用户点击Link your twitter account
。 在这里任何人都可以,写出上面我pseduo凭证从beging直到这个工作流程的最终实现我的目标一些伪代码吗? 谢谢。
更新:
我开始与请求请求令牌作为
require 'oauth'
consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET,
{ site: "https://twitter.com"})
request_token = consumer.get_request_token oauth_callback: 'http://www.mysite.com/tauth'
redirect_to request_token.authorize_url
我不熟悉的ROR,但这里是OAuth的“舞蹈”,你需要在用户点击您的按钮,遵循的工作流程:
通过发送一个请求获得从Twitter未授权请求令牌
POST https://api.twitter.com/oauth/request_token
签约使用消费者的秘密请求。 这将在后台完成,将是对用户透明。
您将收到时的oauth_token和oauth_token_secret从Twitter回来。
将用户重定向到
https://api.twitter.com/oauth/authorize?oauth_token=[token_received_from_twitter]
使用你从Twitter在步骤2中获得OAuth令牌值。
当用户授权您的应用程序,他们将被重定向到的oauth_token和oauth_verifier添加到URL回调网址。 即
http://www.mysite.com/cback?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&oauth_verifer=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY
转换请求令牌到一个访问令牌通过与oauth_verifier沿着发送签名的请求
POST https://api.twitter.com/oauth/access_token
与你的消费者的秘密,并在步骤2中接收的令牌秘密签署的请求。
如果一切正常的话,您将收到一个新的oauth_token
和oauth_token_secret
从Twitter。 这是用户的访问令牌。
使用访问令牌和秘密接受了第6步就可以使代表Twitter的API调用,用户通过发送请求签署到相应的API端点。
希望大家通过这次解决您的问题,但我建立了这个样本登录与Twitter红宝石的Web应用程序提供你需要做这种整合所有的解释。 下面有一个实现带注释的所有必要方法的类:
require "net/https"
require "simple_oauth"
# This class implements the requests that should
# be done to Twitter to be able to authenticate
# users with Twitter credentials
class TwitterSignIn
class << self
def configure
@oauth = YAML.load_file(TWITTER)
end
# See https://dev.twitter.com/docs/auth/implementing-sign-twitter (Step 1)
def request_token
# The request to get request tokens should only
# use consumer key and consumer secret, no token
# is necessary
response = TwitterSignIn.request(
:post,
"https://api.twitter.com/oauth/request_token",
{},
@oauth
)
obj = {}
vars = response.body.split("&").each do |v|
obj[v.split("=").first] = v.split("=").last
end
# oauth_token and oauth_token_secret should
# be stored in a database and will be used
# to retrieve user access tokens in next requests
db = Daybreak::DB.new DATABASE
db.lock { db[obj["oauth_token"]] = obj }
db.close
return obj["oauth_token"]
end
# See https://dev.twitter.com/docs/auth/implementing-sign-twitter (Step 2)
def authenticate_url(query)
# The redirection need to be done with oauth_token
# obtained in request_token request
"https://api.twitter.com/oauth/authenticate?oauth_token=" + query
end
# See https://dev.twitter.com/docs/auth/implementing-sign-twitter (Step 3)
def access_token(oauth_token, oauth_verifier)
# To request access token, you need to retrieve
# oauth_token and oauth_token_secret stored in
# database
db = Daybreak::DB.new DATABASE
if dbtoken = db[oauth_token]
# now the oauth signature variables should be
# your app consumer keys and secrets and also
# token key and token secret obtained in request_token
oauth = @oauth.dup
oauth[:token] = oauth_token
oauth[:token_secret] = dbtoken["oauth_token_secret"]
# oauth_verifier got in callback must
# to be passed as body param
response = TwitterSignIn.request(
:post,
"https://api.twitter.com/oauth/access_token",
{:oauth_verifier => oauth_verifier},
oauth
)
obj = {}
vars = response.body.split("&").each do |v|
obj[v.split("=").first] = v.split("=").last
end
# now the we got the access tokens, store it safely
# in database, you're going to use it later to
# access Twitter API in behalf of logged user
dbtoken["access_token"] = obj["oauth_token"]
dbtoken["access_token_secret"] = obj["oauth_token_secret"]
db.lock { db[oauth_token] = dbtoken }
else
oauth_token = nil
end
db.close
return oauth_token
end
# This is a sample Twitter API request to
# make usage of user Access Token
# See https://dev.twitter.com/docs/api/1.1/get/account/verify_credentials
def verify_credentials(oauth_token)
db = Daybreak::DB.new DATABASE
if dbtoken = db[oauth_token]
# see that now we use the app consumer variables
# plus user access token variables to sign the request
oauth = @oauth.dup
oauth[:token] = dbtoken["access_token"]
oauth[:token_secret] = dbtoken["access_token_secret"]
response = TwitterSignIn.request(
:get,
"https://api.twitter.com/1.1/account/verify_credentials.json",
{},
oauth
)
user = JSON.parse(response.body)
# Just saving user info to database
user.merge! dbtoken
db.lock { db[user["screen_name"]] = user }
result = user
else
result = nil
end
db.close
return result
end
# Generic request method used by methods above
def request(method, uri, params, oauth)
uri = URI.parse(uri.to_s)
# always use SSL, you are dealing with other users data
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
# uncomment line below for debug purposes
#http.set_debug_output($stdout)
req = (method == :post ? Net::HTTP::Post : Net::HTTP::Get).new(uri.request_uri)
req.body = params.to_a.map { |x| "#{x[0]}=#{x[1]}" }.join("&")
req["Host"] = "api.twitter.com"
# Oauth magic is done by simple_oauth gem.
# This gem is enable you to use any HTTP lib
# you want to connect in OAuth enabled APIs.
# It only creates the Authorization header value for you
# and you can assign it wherever you want
# See https://github.com/laserlemon/simple_oauth
req["Authorization"] = SimpleOAuth::Header.new(method, uri.to_s, params, oauth)
http.request(req)
end
end
end
:在更详细的解释https://github.com/lfcipriani/sign_in_with_twitter_sample