Javascript node.js上的OAuth存在问题
我正在尝试让OAuth在node.js上工作。我在节点oauth的文档中发现了这一点:Javascript node.js上的OAuth存在问题,javascript,oauth,node.js,Javascript,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"); 报告中的下一步是: “然后按照正常通道获得有效的访问令牌+访问令牌密钥” 这些“正常通道”是什么 我知道用户必须以某种方式在“供应商”站点上
var OAuth= require('oauth').OAuth;
var oa = new OAuth(requestUrl,accessUrl,consumerKey,consumerSecret,"1.0A",responseUrl,"HMAC-SHA1");
报告中的下一步是:
“然后按照正常通道获得有效的访问令牌+访问令牌密钥”
这些“正常通道”是什么
我知道用户必须以某种方式在“供应商”站点上进行身份验证,并且通过某种方式调用响应url,但我找不到如何实现这一点的描述。有人能给我点化一下吗?我不确定您要连接的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/callback。在该回调中,您将收到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?'))
});
希望这有帮助!当我开始这样做的时候,我也遇到了同样的问题 访问令牌是在引导用户完成“OAuth舞蹈”(其亲切的名称)之后颁发给您的应用程序的。这意味着获得一个请求令牌并将用户重定向到提供商(在本例中为Twitter)进行授权。如果用户授予授权,Twitter将使用可交换为访问令牌的代码将用户重定向回您的应用程序 节点oauth可用于管理此过程,但更高级别的库将使其更容易。(我是该书的作者)就是这样一个图书馆。在本例中,请参阅指南,它将OAuth舞蹈简化为几行代码
之后,您可以将访问令牌保存在数据库中,并使用节点oauth以通常的方式使用它访问受保护的资源。向用户时间轴发布tweet的更新:
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)
}
});
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?'))
});
@Mattmcanus,扩展@Mattmcanus不错的答案,我想在timeline上发布一条推特。为此,我使用与上面给出的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)
}
});
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?'))
});
第二步:
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)
}
});
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\u访问\u令牌和oauth\u访问\u令牌。这将在用户的时间线上发布推文更新。快乐推特 非常感谢!你怎么知道的?尝试和错误,或者你找到了一个好的教程?没有真正找到一个教程。主要是通过查看TwitterOAuth文档和搜索oauth模块的SourcePassport.js是否提供了通过http代理执行oauth的方法??这里有一个节点oauth的补丁:我希望看到合并,这将允许您所要求的。