我想让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中的下一步说:
“然后按照正常渠道获取有效的访问令牌+访问令牌密码”
这些“正常频道”是什么?
我知道用户必须以某种方式在“供应商”网站上进行身份验证,并通过某种方式调用响应网址,但我找不到如何实现此操作的说明。有人可以开导我吗?
答案 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 。这将向用户的时间线发布推文更新。快乐的推特!!!