node.js上的OAuth出现问题

我正在尝试让OAuth在node.js上工作。 我在node-oauth的文档中发现了这个:

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

官方教程的下一步说:

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

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

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

我不确定您尝试连接的是哪种OAuth服务,所以我只以twitter为例。 创buildOAuth对象后,您需要先请求一个oauth标记。 当你得到这个令牌的时候,你需要redirect到twitter,他们的validation页面,要么提示他们login,然后询问应用程序是否可以login。

 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) } }); 

当您第一次创buildOAuth对象时,您将设置一个responseURL或callbackurl。 它可以是任何东西,因为我的应用程序只是/ oauth /callback。 在callback中,您将收到oauthvalidation器令牌。 然后,您同时使用oauth请求令牌和oauthvalidation者令牌来请求访问令牌。 当您收到访问令牌时,您还将收到他们通过的任何内容,如用户名。

 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?')) }); 

希望这可以帮助! 我在开始时遇到了同样的问题。

访问令牌在用户通过“OAuth舞蹈”(如其亲切地知道的)之后走向您的应用程序。 这意味着获取请求令牌并将用户redirect到提供者(在这种情况下为Twitter)进行授权。 如果用户授予授权,则Twitter会将用户redirect回您的应用程序,其代码可以交换为访问令牌。

node-oauth可以用来pipe理这个过程,但是更高级的库会使它更容易。 护照 (我是作者)就是这样一个图书馆。 在这种情况下,请查看Twitterauthentication指南,这可以简化OAuth跳至几行代码。

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

向用户时间表发布tweet的更新:

@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_tokenoauth_access_token_secret 。 这将在用户的时间表上发布推特更新。 快乐推特!!!