【问题标题】:Post To Twitter on Behalf of Another User using Node.js, express, twit, and passport-twitter使用 Node.js、express、twit 和 passport-twitter 代表另一个用户发布到 Twitter
【发布时间】:2020-03-09 23:12:58
【问题描述】:

使用 Twitter API,我试图代表 Twitter 用户发布一条推文。

我正在使用节点和 passport-twittertwit 模块。

一些资源:

成功按照上面的教程通过 passport-twitter 进行了身份验证。

我还成功在我的 twitter 开发者帐户上使用 twit 发布。

但是,我无法将这两件事结合起来;试图代表另一个用户在 Twitter 上发帖。为此,我需要获取用户的访问令牌和访问令牌秘密。然后,我需要使用该信息向 Twitter API 发出发布请求。

我不确定将发布请求放在护照推特代码中的哪个位置。我尝试将它放在第二个路由中,即 Twitter 在用户登录后将其重定向到的 URL。

   app.get('/twitter/login', passport.authenticate('twitter'))

   app.get('/twitter/return', passport.authenticate('twitter', {
       failureRedirect: '/'
   }), function(req, res) {
     //Post using twit
     //grab access token and access token secret from the request query
       const access_token = req.query.oauth_token;
       const access_token_secret = req.query.oauth_verifier;

       //set the configurations with the access token and access token secret that we just got
       const config = {
         consumer_key:         <consumer key here>,
         consumer_secret:      <consumer secret here>,
         access_token, 
         access_token_secret,
         timeout_ms:           60*1000,  
         strictSSL:            true
       }

       //pass in the configurations
       var T = new Twit(config);

       //post
       T.post('statuses/update', { status: 'hello world!' }, function(err, data, response) {
         if (err)console.log("oops, didn't tweet: ", err.message);
       })

       res.redirect('/');
   })

但我收到一个错误:Invalid or expired token.

我希望它能够工作,因为身份验证有效。

这是我第一次使用 OAuth,所以我可能误解了这一切的工作原理。

我应该将发布请求放在哪里?

更新:

我尝试使用我的开发帐户的访问令牌和密码发布到我的开发帐户。有效。这让我相信用户的访问令牌和密码有问题。

我想我部分知道发生了什么。

我假设在请求查询对象中找到的属性oauth_verifier 是访问令牌秘密。

const access_token_secret = req.query.oauth_verifier;

但现在我不认为oauth_verifier 与访问令牌秘密相同。 oauth_verifier 的字符数少于我的开发帐户的访问令牌密码。所以看起来数据类型不一样。

但是现在我想弄清楚访问令牌的秘密在哪里?请求查询对象中只有两个属性(req.query);

  • oauth_token

  • oauth_verifier

用户的访问令牌秘密在哪里?

【问题讨论】:

    标签: node.js authentication twitter oauth twitter-oauth


    【解决方案1】:

    我解决了我的问题。它一直在passport-twitter 的文档中。伙计,我在这个问题上花了几天时间。

    该策略还需要一个验证回调,它接收 访问令牌相应的秘密 作为参数,以及包含经过身份验证的用户的 Twitter 个人资料的个人资料。

    -来自passport-twitter readMe

    docs 的示例中,您可以在参数中看到tokentokenSecret

    passport.use(new TwitterStrategy({
      consumerKey: TWITTER_CONSUMER_KEY,
      consumerSecret: TWITTER_CONSUMER_SECRET,
      callbackURL: "http://127.0.0.1:3000/auth/twitter/callback"
      },
      function(token, tokenSecret, profile, cb) {
        User.findOrCreate({ twitterId: profile.id }, function (err, user) {
          return cb(err, user);
        });
      }
    ));
    

    我以前读过这个,也看过这个。但假设这是 consumer keyconsumer secret。我没有意识到这是我要找的东西:访问令牌访问密码

    所以你的推特帖子会是这样的:

    passport.use(new Strategy({
      consumerKey: process.env.CONSUMER_KEY,
      consumerSecret: process.env.CONSUMER_SECRET,
      callbackURL: 'http://localhost:3000/twitter/return'
    }, function(token, tokenSecret, profile, callback) {
      const configs = createConfigs(token, tokenSecret);
    
    
      // Post to twitter
    
      var Twit = require('twit')
    
      var T = new Twit({
        consumer_key:         '...', //get this from developer.twitter.com where your app info is
        consumer_secret:      '...', //get this from developer.twitter.com where your app info is
        access_token:         token,
        access_token_secret:  tokenSecret,
        timeout_ms:           60*1000,  // optional HTTP request timeout to apply to all requests.
        strictSSL:            true,     // optional - requires SSL certificates to be valid.
      })
    
      //
      //  tweet 'hello world!'
      //
      T.post('statuses/update', { status: 'hello world!' }, function(err, 
      data, response) {
        console.log(data)
      })
    
    
      return callback(null, profile);
    }));
    
    

    【讨论】:

    • 嗨@MuhanadY 我无法理解你在问什么
    • 非常感谢您的回复。我确实解决了这个问题并忘记删除评论。对此感到抱歉
    猜你喜欢
    • 2019-04-10
    • 2019-07-03
    • 2014-12-17
    • 2017-06-13
    • 2018-05-20
    • 2023-02-15
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多