node.js上的OAuth问题

时间:2011-03-25 05:07:05

标签: javascript oauth node.js

我想让OAuth在node.js上工作。我在node-oauth的文档中找到了这个:

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

official tutorial中的下一步说:

  

“然后按照正常渠道获取有效的访问令牌+访问令牌密码”

这些“正常频道”是什么?

我知道用户必须以某种方式在“供应商”网站上进行身份验证,并通过某种方式调用响应网址,但我找不到如何实现此操作的说明。有人可以开导我吗?

3 个答案:

答案 0 :(得分: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或回调网址。它可以是任何东西,对于我的应用程序它只是/ oauth /回调。在该回调中,您将收到oauth验证程序令牌。然后,您可以使用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?'))
});

希望这有帮助!当我开始这个时,我遇到了同样的问题。

答案 1 :(得分:2)

访问令牌是在用户走过“OAuth舞蹈”之后发给您的应用程序的(正如其亲切地知道的那样)。这意味着获取请求令牌并将用户重定向到提供者(在本例中为Twitter)以进行授权。如果用户授予授权,Twitter会使用可以交换访问令牌的代码将用户重定向回您的应用程序。

node-oauth可用于管理此过程,但更高级别的库将使其更容易。 Passport(我是其作者)就是这样一个图书馆。在这种情况下,请查看Twitter authentication指南,该指南将OAuth简化为几行代码。

之后,您可以将访问令牌保存在数据库中,并使用node-oauth以常规方式访问受保护资源。

答案 2 :(得分: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?'))
    });

我添加了 oauth_access_token &评论代码中的 oauth_access_token_secret 。这将向用户的时间线发布推文更新。快乐的推特!!!