是否有任何 Node.js 客户端库可以对 Twitter、Facebook、Google、LinkedIn 等进行 OAuth 和 OAuth2 API 调用?

Posted

技术标签:

【中文标题】是否有任何 Node.js 客户端库可以对 Twitter、Facebook、Google、LinkedIn 等进行 OAuth 和 OAuth2 API 调用?【英文标题】:Is there any Node.js client library to make OAuth and OAuth2 API calls to Twitter, Facebook, Google, LinkedIn, etc.? 【发布时间】:2014-02-03 20:25:55 【问题描述】:

我做了很多谷歌搜索,我能找到的最好的是: https://github.com/ciaranj/node-oauth

在此之上是否有任何库,它们提供包装器以对 Twitter、Facebook、Google、LinkedIn 等进行 API 调用,以发布推文或 DM 某人或获取朋友列表或发布到 Facebook/G+ 的链接等人?

我知道 Passport.js,但它的用途仅限于从这些社交网站获取身份验证和授权。除此之外,目前我们将不得不通过 node-oauth 个性化 API 调用以执行上述活动。

我错过了什么吗?你知道有这样的图书馆吗?

【问题讨论】:

【参考方案1】:

CloudRail 可能是一个不错的选择。它为大多数社交网络提供了一个抽象的 API,并且很好地处理了身份验证。这是一个例子:

const services = require("cloudrail-si").services;
// let profile = new services.GooglePlus(redirectReceiver, "[clientIdentifier]", "[clientSecret]", "[redirectUri]", "[state]");
// let profile = new services.GitHub(redirectReceiver, "[clientIdentifier]", "[clientSecret]", "[redirectUri]", "[state]");
// let profile = new services.Slack(redirectReceiver, "[clientIdentifier]", "[clientSecret]", "[redirectUri]", "[state]");
// let profile = new services.Instagram(redirectReceiver, "[clientIdentifier]", "[clientSecret]", "[redirectUri]", "[state]");
// ...
let profile = new services.Facebook(redirectReceiver, "[clientIdentifier]", "[clientSecret]", "[redirectUri]", "[state]");

profile.getFullName((err, fullName) => 
    if (err) throw err;
    console.log("User's full name is " + fullName);
);

profile.getEmail((err, email) => 
    if (err) throw err;
    console.log("User's email address is " + email);
);

【讨论】:

【参考方案2】:

我也在部署Passport.js,并且需要在身份验证之外提取额外的请求。 我接受了 Jared Hanson 的“请求”建议,并使用了在 README 底部找到的 Twitter 示例'request' github。在最初的 var request = require('request');var qs = require('querystring'); 之后,这里是 Twitter 护照验证和获取 follower_count 示例 - 辅助请求嵌套在验证回调函数中:

passport.use(new TwitterStrategy(
  // var configAuth = require('./auth');
  consumerKey       : configAuth.twitterAuth.consumerKey,
  consumerSecret    : configAuth.twitterAuth.consumerSecret,
  callbackURL       : configAuth.twitterAuth.callbackURL,
  passReqToCallback : true
,

function(req, token, tokenSecret, profile, done) 

  process.nextTick(function() 

    if (!req.user) 

      User.findOne( 'twitter.id' : profile.id , function(err, user) 
        if (err)
          return done(err);
        if (user) 
          if (!user.twitter.token) 
            user.twitter.token       = token;
            user.twitter.tokenSecret = tokenSecret;
            user.twitter.username    = profile.username;
            user.twitter.displayName = profile.displayName;

            // [ADDED] Twitter extended API calls using 'request' and 'querystring'
            var oauth =  
              consumer_key    : configAuth.twitterAuth.consumerKey, 
              consumer_secret : configAuth.twitterAuth.consumerSecret, 
              token           : token, 
              token_secret    : tokenSecret
            

            var url = 'https://api.twitter.com/1.1/users/show.json?';

            var params =  
              user_id: profile.id
            

            url += qs.stringify(params)
            request.get(url:url, oauth:oauth, json:true, function (e, r, result) 
              // Get followers_count here
              user.twitter.followers = result.followers_count;

              // [MOVED] db.save moved into second callback function
              user.save(function(err) 
                if (err)
                  throw err;
                return done(null, user);
              );
            );
            // [END ADD]        
          
          return done(null, user);
         else 
          var newUser                 = new User();

          newUser.twitter.id          = profile.id;
          newUser.twitter.token       = token;
          newUser.twitter.tokenSecret = tokenSecret;
          newUser.twitter.username    = profile.username;
          newUser.twitter.displayName = profile.displayName;

          // [ADDED] Twitter extended API calls using 'request' and 'querystring'
          var oauth =  
            consumer_key    : configAuth.twitterAuth.consumerKey, 
            consumer_secret : configAuth.twitterAuth.consumerSecret, 
            token           : token, 
            token_secret    : tokenSecret
          

          var url = 'https://api.twitter.com/1.1/users/show.json?';

          var params =  
            user_id: profile.id
          

          url += qs.stringify(params)
          request.get(url:url, oauth:oauth, json:true, function (e, r, result) 
            // Get followers_count here
            newUser.twitter.followers = result.followers_count;

            // [MOVED] db.save moved into second callback function
            newUser.save(function(err) 
              if (err)
                throw err;
              return done(null, newUser);
            );
          );
          // [END ADD]     

        
      );
     else 
      var user                 = req.user;

      user.twitter.id          = profile.id;
      user.twitter.token       = token;
      user.twitter.tokenSecret = tokenSecret;
      user.twitter.username    = profile.username;
      user.twitter.displayName = profile.displayName;

      // [ADDED] Twitter extended API calls using 'request' and 'querystring'
      var oauth =  
        consumer_key    : configAuth.twitterAuth.consumerKey, 
        consumer_secret : configAuth.twitterAuth.consumerSecret, 
        token           : token, 
        token_secret    : tokenSecret
      

      var url = 'https://api.twitter.com/1.1/users/show.json?';

      var params =  
        user_id: profile.id
      

      url += qs.stringify(params)
      request.get(url:url, oauth:oauth, json:true, function (e, r, result) 
        // Get followers_count here
        user.twitter.followers = result.followers_count;

        // [MOVED] db.save moved into second callback function
        user.save(function(err) 
          if (err)
            throw err;
          return done(null, user);
        );
      );     
      // [END ADD]
    
  );
));

非常感谢 Jared 的慷慨帮助和创建 Passport.js!

【讨论】:

【参考方案3】:

在您使用Passport.js 获取访问令牌后,我建议(并亲自使用)request 对第三方服务进行所有 API 调用。

在我看来,特定于提供程序的包装器只会增加不必要的复杂性。大多数 RESTful API 都是非常简单的 HTTP 请求。额外的层只会妨碍并添加要追踪的错误。此外,通过坚持使用request,您可以使用相同、熟悉的模块与任何第三方集成。

【讨论】:

我在 facebook 和 twitter 上使用 passport.js 有什么方法可以让 facebook 和 twitter 的朋友使用它吗? 我认为restler也是一个很好的库来代替请求。 每次想要使用新的 API 服务时都必须重新发明***是浪费时间 我个人使用Purest 作为一个通用的 REST API 库。它建立在 request 之上,但具有特定于 REST API 的功能。另外我使用Grant 作为获取访问令牌的替代方法。

以上是关于是否有任何 Node.js 客户端库可以对 Twitter、Facebook、Google、LinkedIn 等进行 OAuth 和 OAuth2 API 调用?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js:无线电流 Api [关闭]

类似 Node.js 的 Jsoup 库 [关闭]

node.js 中的二进制 RPC

Node js 或 Express js 的基于角色的授权

什么参数对 Node js 的 Google Document AI 客户端库无效?

使用Jasmine和node.js测试客户端javascript代码