2014-01-15 27 views
8

我做了谷歌搜索了很多,我能找到的最好的是: https://github.com/ciaranj/node-oauth是否有任何Node.js客戶端庫可以對Twitter,Facebook,Google,LinkedIn等進行OAuth和OAuth2 API調用?

是否有在此之上的所有庫,提供包裝來進行API調用到Twitter,Facebook,谷歌,LinkedIn等來說發佈推特或DM有人或獲得朋友列表或發佈鏈接到Facebook/G +等。

我知道Passport.js,但其用途僅限於從這些社交網站獲取身份驗證和授權。除此之外,目前我們將不得不通過node-oauth個性化API調用來執行上述活動。

我錯過了什麼嗎?你知道有這樣的圖書館嗎?

回答

21

一旦您使用Passport.js獲取訪問令牌,我推薦(並親自使用)request將所有API調用到第三方服務。

在我看來,提供商特定的包裝只是增加了不必要的複雜性。大多數RESTful API都是非常簡單的HTTP請求。額外的層只會阻礙並添加錯誤來追蹤。此外,通過堅持request,您可以使用相同的,熟悉的模塊與任何第三方集成。

+0

我使用passport.js的臉譜和推特有什麼辦法我可以讓臉譜和推特朋友使用它? –

+0

我認爲restler也是一個很好的lib來代替請求。 –

+0

每當您想要使用新的API服務時都必須重新發明輪子,這是浪費時間 – AshClarke

1

我也部署了Passport.js,並且需要將額外請求拉到身份驗證之外。 我接受了Jared Hanson的'請求'建議,並使用了在自述文件底部找到的'request' github上的Twitter示例。初始var request = require('request');var qs = require('querystring');這裏後,Twitter的護照認證&得到FOLLOWERS_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] 
    } 
    }); 
})); 

非常感謝賈裏德爲是非常慷慨的在他的幫助和創建護照.js文件!

3

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); 
}); 
相關問題