Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js上的OAuth存在问题_Javascript_Oauth_Node.js - Fatal编程技术网

Javascript 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"); 报告中的下一步是: “然后按照正常通道获得有效的访问令牌+访问令牌密钥” 这些“正常通道”是什么 我知道用户必须以某种方式在“供应商”站点上

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

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的补丁:我希望看到合并,这将允许您所要求的。