3

レール上でルビーを試しています。ほとんどの場合、私は Sinatra でコードを書きました。とにかく、この質問はフレームワークで何もする必要がないかもしれません。そして、この質問は非常に初歩的な質問に聞こえるかもしれません。初めて Twitter 1.1 API と 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 に自分に代わってアクションを実行する許可を与える Twitter ポップアップが開きます
3) ユーザーが許可してポップアップが閉じられると、XYZ アプリが取得されますユーザーのアクセス トークンとシークレットをデータベースに保存します。
4) 次に、XYZ はそのユーザーのトークンとシークレットを使用して、今後のアクションを実行します。

このようなワークフローが数千のサイトに実装されており、Twitter API のドキュメントでこの 3-legged 認証が説明されているというのは馬鹿かもしれませんが、それでも理解できません。

https://dev.twitter.com/docs/auth/3-legged-authorizationhttps://dev.twitter.com/docs/auth/implementing-sign-twitterを読み ました 残念ながら、インターネット上でルビーコードが見つかりませんでしたステップバイステップの例で説明します。

ユーザーが をクリックしたときに Twitter 認証ページを開くために使用するリンクLink your twitter account。このワークフローの最初から最後まで私の目標を達成するために、上記の疑似資格情報を使用して疑似コードを記述できる人はいますか? ありがとう。

アップデート:

としてリクエストトークンをリクエストすることから始めました

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

4

2 に答える 2

4

私は ROR に詳しくありませんが、ユーザーがボタンをクリックしたときに従わなければならない OAuth の「ダンス」のワークフローは次のとおりです。

  1. にリクエストを送信して、Twitter から無許可のリクエスト トークンを取得します。

    投稿https://api.twitter.com/oauth/request_token

    コンシューマ シークレットを使用してリクエストに署名します。これはバックグラウンドで行われ、ユーザーには透過的です。

  2. twitter から oauth_token と oauth_token_secret を受け取ります。

  3. ユーザーをリダイレクトする

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

    ステップ 2 で Twitter から受け取った oauth トークン値を使用します。

  4. ユーザーがアプリを承認すると、URL に oauth_token と oauth_verifier が追加されたコールバック URL にリダイレクトされます。すなわち

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

  5. 署名付きリクエストを oauth_verifier とともに送信して、リクエスト トークンをアクセス トークンに変換します。

    投稿 https://api.twitter.com/oauth/access_token

    ステップ 2 で受け取ったコンシューマ シークレットとトークン シークレットを使用してリクエストに署名します。

  6. 問題がなければ、Twitter から新しいoauth_tokenと が届きます。oauth_token_secretこれは、ユーザーのアクセス トークンです。

  7. 手順 6 で受け取ったアクセス トークンとシークレットを使用して、適切な API エンドポイントに署名付きの要求を送信することで、ユーザーに代わって Twitter API 呼び出しを行うことができます。

于 2013-05-13T10:26:26.550 に答える
2

この時点で問題が解決されていることを願っていますが、この統合を行うために必要なすべての説明を提供するこのサンプル Sign in with Twitter ruby​​ 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

于 2013-11-28T12:49:24.557 に答える