2011-03-25 4 views
21

OAuthをnode.jsで動作させようとしています。私は、ノードのOAuthのドキュメントでこれを見つけた:node.jsのOAuthに関する問題

var OAuth= require('oauth').OAuth; 
var oa = new OAuth(requestUrl,accessUrl,consumerKey,consumerSecret,"1.0A",responseUrl,"HMAC-SHA1"); 

official tutorialの次のステップは言う:

を「次に通常のチャネルごとに有効なアクセストークン+アクセストークンシークレットを手に入れます"

"通常のチャンネル "は何ですか?

「ベンダー」サイトで何らかの形で認証されていなければならないことがわかりました。何らかの方法で応答URLが呼び出されましたが、これを実装する方法はわかりません。誰かが私を啓発することはできますか?

答えて

23

接続しようとしているOAuthサービスがわからないので、例としてtwitterを使用します。 OAuthオブジェクトを作成したら、最初にoauthトークンを要求する必要があります。そのトークンを取得すると、Twitterにログインするように促す認証ページにリダイレクトする必要があります。次に、ログインすることが妥当かどうかを尋ねます。

oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results){ 
    if (error) new Error(error.data) 
    else { 
    req.session.oauth.token = oauth_token 
    req.session.oauth.token_secret = oauth_token_secret 
    res.redirect('https://twitter.com/oauth/authenticate?oauth_token='+oauth_token) 
    } 
}); 

OAuthオブジェクトを初めて作成したときは、responseURLまたはコールバックURLを設定します。それは私のアプリのためだけに/ oauth /コールバック、何でもかまいません。そのコールバックでは、oauth verifierトークンを受け取ります。次に、oauth要求トークンとoauth検証トークンの両方を使用して、アクセストークンを要求します。アクセストークンを受け取ると、ユーザー名のように、アクセストークンも渡されます。

app.get('/oauth/callback', function(req, res, next){ 
    if (req.session.oauth) { 
    req.session.oauth.verifier = req.query.oauth_verifier 
    var oauth = req.session.oauth 

    oa.getOAuthAccessToken(oauth.token,oauth.token_secret,oauth.verifier, 
     function(error, oauth_access_token, oauth_access_token_secret, results){ 
     if (error) new Error(error) 
     console.log(results.screen_name) 
    } 
); 
} else 
    next(new Error('No OAuth information stored in the session. How did you get here?')) 
}); 

これが役に立ちます。私はこれを始めたときも同じ問題を抱えていました。

+0

ありがとうございます!どのようにそれを把握しましたか?試行錯誤するか、良いチュートリアルを見つけましたか? – Thomas

+1

実際にチュートリアルは見つかりませんでした。 twitterのoauthのドキュメントを参照し、oauthモジュールのソースを調べることによって、ほとんどそれを把握してください。 – mattmcmanus

2

アクセストークンは、「OAuthダンス」(愛称として知られている)によってユーザーを歩いた後、アプリケーションに発行されます。これは、リクエストトークンを取得し、ユーザをプロバイダ(この場合はTwitter)にリダイレクトして承認することを意味します。ユーザーが承認を許可すると、Twitterはアクセストークンと交換できるコードでユーザーをアプリケーションにリダイレクトします。

node-oauthを使用してこのプロセスを管理できますが、上位レベルのライブラリを使用する方がずっと簡単です。 Passport(私が作者である)は、このようなライブラリの1つです。この場合は、Twitter authenticationのガイドを参照してください。OAuthのダンスを数行のコードに単純化します。

その後、データベースにアクセストークンを保存し、node-oauthを使用して通常の方法で保護されたリソースにアクセスすることができます。

+0

Passport.jsは、http-proxy経由でoauthを実行する方法を提供していますか? –

+1

ここにnode-oauth用のパッチがあります:https://github.com/ciaranj/node-oauth/pull/108あなたが求めていることを許す、合併されたものを見たいのですが。 –

+0

おかげです。 –

0

ユーザーのタイムラインにつぶやきを投稿する更新:

@mattmcmanusは、素敵な答え@mattmcmanus拡張、私は、タイムラインにつぶやきを投稿したいと思います。このために、私は上記のmattcmanusと同じコードを使用しています。

ステップ1:

oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results){ 
    if (error) new Error(error.data) 
    else { 
    req.session.oauth.token = oauth_token 
    req.session.oauth.token_secret = oauth_token_secret 
    res.redirect('https://twitter.com/oauth/authenticate?oauth_token='+oauth_token) 
    } 
}); 

ステップ2:

app.get('/oauth/callback', function(req, res, next){ 
     if (req.session.oauth) { 
     req.session.oauth.verifier = req.query.oauth_verifier 
     var oauth = req.session.oauth 

     oa.getOAuthAccessToken(oauth.token,oauth.token_secret,oauth.verifier, 
      function(error, oauth_access_token, oauth_access_token_secret, results){ 
      if (error) new Error(error){ 
      console.log(results.screen_name) 
      }else{ 

       // NEW CODE TO POST TWEET TO TWITTER 
       oa.post(
       "https://api.twitter.com/1.1/statuses/update.json", 
       oauth_access_token, oauth_access_token_secret, 
       {"status":"Need somebody to love me! I love OSIpage, http://www.osipage.com"}, 
       function(error, data) { 
        if(error) console.log(error) 
        else console.log(data) 
       } 
       ); 
       // POST TWEET CODE ENDS HERE 

      } 
     } 
    ); 
    } else 
     next(new Error('No OAuth information stored in the session. How did you get here?')) 
    }); 

Iはコメントコードでoauth_access_token_secretoauth_access_token & を加えました。これにより、ユーザーのタイムラインにツイートのアップデートが送信されます。ハッピーtweeting!