是否有任何 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 调用?的主要内容,如果未能解决你的问题,请参考以下文章