【问题标题】:Problems with OAuth on node.jsnode.js 上的 OAuth 问题
【发布时间】:2011-07-22 16:10:07
【问题描述】:

我正在尝试让 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 中的下一步说:

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

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

我知道用户必须以某种方式在“供应商”网站上进行身份验证,并且通过某种方式调用了响应 url,但我找不到如何实现这一点的描述。有人可以启发我吗?

【问题讨论】:

    标签: javascript oauth node.js


    【解决方案1】:

    将推文发布到用户时间线的更新:

    @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。这会将推文更新发布到用户的时间线。推特快乐!!!

    【讨论】:

      【解决方案2】:

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

      node-oauth 可以用来管理这个过程,但是更高级别的库会更容易。 Passport(我是它的作者)就是这样一个库。在这种情况下,请查看Twitter authentication 的指南,它将 OAuth 舞蹈简化为几行代码。

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

      【讨论】:

      • Passport.js 是否提供了通过 http 代理进行 oauth 的任何方法??
      • 这里有一个 node-oauth 的补丁:github.com/ciaranj/node-oauth/pull/108 我希望看到它被合并,这将允许你所要求的。
      【解决方案3】:

      我不确定您要连接的 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?'))
      });
      

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

      【讨论】:

      • 非常感谢您!你是怎么想出来的?反复试验还是找到了好的教程?
      • 真的没有找到教程。主要是通过查看 twitter oauth 文档并翻阅 oauth 模块的源代码来解决的
      猜你喜欢
      • 2021-10-27
      • 2011-04-04
      • 2017-06-28
      • 2023-04-06
      • 2011-07-01
      • 1970-01-01
      • 2018-06-13
      • 2021-05-12
      • 2011-11-01
      相关资源
      最近更新 更多