我正在使用 Node.js 开发一个项目,我们需要为客户提供安全授权,就 Facebook 和 Twitter 而言,我们必须使用他们的 API 验证令牌
我用谷歌搜索并找到了许多示例,但都使用第三方 API,即 Facebook、Twitter 等
但问题是我们必须发布自己的令牌,设备在与我们的 API 对话时将使用该令牌。是否有任何为 Node.js 实现的模块来验证和生成令牌?
我不清楚您想要找到一个提供 OAuth2 客户端功能的节点模块(所有这些模块本质上都是第 3 方 API)是什么意思,该功能无需额外的服务器调用即可在 facebook 和 twitter 上工作。
不过话虽如此,您可能会看这些:
而且由于 Node.js 是 javascript,只要您模拟客户端 javascript 所期望的必要浏览器环境元素,您就可以封装为客户端浏览器编写的常规 javascript。
您的问题让我认为封装此处提供的 OAuth 库可能很有用:https ://github.com/andreassolberg/jso并将其汇总到 Node 模块中,这样您就可以拥有一个行为类似于浏览器的客户端一个 OAuth2 提供者,但来自 Node.js 内部。
所以这里是该项目的开始:
它在 github ( https://github.com/hoonto/node-jso ) 或
npm instal node-jso
由于我需要修补它进行本地存储和 xhr 的方式,因此它不太可能工作,但我认为修复它非常简单。
我提供了一些回调函数,所以你可以像这样使用它:
var jso = require("node-jso")('http://www.google.com');
jso.onlocation = function(location){
//Handle location changes
};
jso.onhash = function(hash){
//Handle hash changes
};
jso.onhref = function(href){
//Handle href changes
};
jso.jso_configure({
"facebook": {
client_id: "xxxxxxxxxx",
redirect_uri: "http://localhost/~andreas/jso/",
authorization: "https://www.facebook.com/dialog/oauth",
presenttoken: "qs"
}
});
如果您愿意提供帮助,请随时提交拉取请求!
您在 hoonto 的帖子中看到的客户 ID 是您必须在 Facebook 网站上生成的客户 ID。这是您的应用程序的客户端 ID,而不是用户的客户端 ID。因此,您只需填写一次,没有 oAuth 模块将无法正常工作。
您需要为每个社交媒体(FB、TW 和 GP)创建一个应用程序。
例如,对于 Facebook,您可以使用应用页面获取此客户端 ID: https ://developers.facebook.com/apps
对于 Google Plus,您可以在控制台页面中生成客户端 ID:https ://code.google.com/apis/console/
这将验证令牌https://github.com/jaredhanson/passport-http-bearer并且有很多方法可以生成令牌(电子邮件+密码+盐的 md5)
如果我明白你的意思是什么,我的项目具有相同的功能。我的应用程序充当 Oauth2 提供者,但将授权委托给其他提供者。我的应用程序不支持范围,因为它需要额外的对话框,所以我还没有使用所有 oauth2 功能。但我计划在未来。我使用了这个模块:
工作中的主要帮助是来自 oauth2orize 模块的示例。
您可以在没有任何额外模块的情况下执行简单的仅限 Twitter 应用程序的 OAuth2。
var https = require('https');
var querystring = require('querystring');
var postData = querystring.stringify({
'grant_type' : 'client_credentials'
})
var options = {
hostname: 'api.twitter.com',
path: '/oauth2/token',
method: 'POST',
headers: {
'Authorization': 'Basic ' + new Buffer(
process.env.CONSUMER_KEY + ":" + process.env.CONSUMER_SECRET
).toString('base64'),
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'Content-Length': postData.length
} // headers
}
var req = https.request(options, function(res) {
console.log("statusCode: ", res.statusCode);
console.log("headers: ", res.headers);
res.on('data', function(d) {
process.stdout.write(d);
});
});
req.on('error', function(e) {
console.error(e);
});
req.write(postData);
req.end();
如果你把上面的代码放在 foo.js 中,那么你应该得到类似的东西:
$ node foo.js
statusCode: 200
headers: { 'cache-control': 'no-cache, no-store, must-revalidate, pre-check=0, post-check=0',
connection: 'close',
'content-disposition': 'attachment; filename=json.json',
'content-length': '155',
'content-type': 'application/json;charset=utf-8',
date: 'Mon, 07 Sep 2015 03:50:59 GMT',
expires: 'Tue, 31 Mar 1981 05:00:00 GMT',
'last-modified': 'Mon, 07 Sep 2015 03:50:59 GMT',
ml: 'S',
pragma: 'no-cache',
server: 'tsa_a',
'set-cookie': [ 'guest_id=v1%3A144159785995688631; Domain=.twitter.com; Path=/; Expires=Wed, 06-Sep-2017 03:50:59 UTC' ],
status: '200 OK',
'strict-transport-security': 'max-age=631138519',
'x-connection-hash': 'e3fa57b3959c2fdf39fdf4bdd5851b35',
'x-content-type-options': 'nosniff',
'x-frame-options': 'SAMEORIGIN',
'x-response-time': '21',
'x-transaction': '2296d03323316c3e',
'x-tsa-request-body-time': '0',
'x-twitter-response-tags': 'BouncerCompliant',
'x-ua-compatible': 'IE=edge,chrome=1',
'x-xss-protection': '1; mode=block' }
{"token_type":"bearer","access_token":"[YOUR ACCESS TOKEN HERE!!!]"}