推特红宝石3条腿的授权(Twitter 3-legged authorization in Ruby

2019-09-02 19:16发布

我想在轨道上我的手红宝石。 主要是我已经在西纳特拉编写的代码。 反正这个问题可能没有做任何事情的框架。 而这个问题可能听起来很新手的问题。 我与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

Answer 1:

我不熟悉的ROR,但这里是OAuth的“舞蹈”,你需要在用户点击您的按钮,遵循的工作流程:

  1. 通过发送一个请求获得从Twitter未授权请求令牌

    POST https://api.twitter.com/oauth/request_token

    签约使用消费者的秘密请求。 这将在后台完成,将是对用户透明。

  2. 您将收到时的oauth_token和oauth_token_secret从Twitter回来。

  3. 将用户重定向到

    https://api.twitter.com/oauth/authorize?oauth_token=[token_received_from_twitter]

    使用你从Twitter在步骤2中获得OAuth令牌值。

  4. 当用户授权您的应用程序,他们将被重定向到的oauth_token和oauth_verifier添加到URL回调网址。 即

    http://www.mysite.com/cback?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&oauth_verifer=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY

  5. 转换请求令牌到一个访问令牌通过与oauth_verifier沿着发送签名的请求

    POST https://api.twitter.com/oauth/access_token

    与你的消费者的秘密,并在步骤2中接收的令牌秘密签署的请求。

  6. 如果一切正常的话,您将收到一个新的oauth_tokenoauth_token_secret从Twitter。 这是用户的访问令牌。

  7. 使用访问令牌和秘密接受了第6步就可以使代表Twitter的API调用,用户通过发送请求签署到相应的API端点。



Answer 2:

希望大家通过这次解决您的问题,但我建立了这个样本登录与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



文章来源: Twitter 3-legged authorization in Ruby