我正在尝试使用 NodeJS
、node-dbox
和 Express
组合一个小应用程序。
请求 DropBox
授权时 - it's a 3 step process ,首先需要获取request_token
,然后用户授权他们访问dropbox页面,然后才请求access_token
,基于request_token
和事实用户已授权请求。
但是,当我为第 1 步和第 2 步提供页面时(获取 request_token
,并为用户提供 url)- request_token
实例消失了!,所以在第 3 步 我无法请求 access_token
,因为它需要传递 request_token
我正在尝试将 request_token
保存在 cookie 中,但鉴于其中包含敏感数据,将其发送到客户端可能不是一个好主意。有什么想法吗?
简化代码如下:
(function() {
var dbox = require('dbox'),
config = require('easy-config'),
express = require('express'),
dboxApp = dbox.app(config.dropbox_credentials),
app = express();
app.use(express.cookieParser());
app.get('/', function(req, res) {
dboxApp.requesttoken(function(status, request_token) {
res.cookie('request_token', JSON.stringify(request_token));
res.send("<a href='" + request_token.authorize_url + "' targe='_new'>authorize via dropbox</a><br/>" + "<a href='/next'>next</a>");
});
});
app.get('/next', function(req, res) {
var request_token = JSON.parse(req.cookies.request_token);
if(request_token) {
dboxApp.accesstoken(request_token, function(status, access_token) {
var client = dboxApp.client(access_token);
client.account(function(status, reply){
res.send(reply);
});
});
} else {
res.send('sorry :(');
}
});
app.listen(3000);
})();
奖励问题:client
是使用 access_token
创建的,因此客户端实例或 access_token
也需要在页面刷新时保持不变,最好的方法是什么?
最佳答案
我设法通过执行以下操作让它工作:
根据 Dropbox Developer 引用,您可以通过在请求中指定回调 url 来提供回调 url,如下所述:
https://www.dropbox.com/developers/blog/20
https://www.dropbox.com/1/oauth/authorize?oauth_token=<request-token>&oauth_callback=<callback-url>
通过将请求 token 存储在 session 中并重定向到回调 url,您可以访问请求 token 并继续使用。 几个 Express 路由处理程序,将成员 ID 作为参数传递,请求然后处理响应可能如下所示:
linkAccount : function(req, res){
var memberId = req.params.memberId,
appKey = 'MYAPPKEY',
appSecret = 'MYAPPSECRET',
dbox = require('dbox'),
dboxApp = dbox.app({ "app_key": appKey, "app_secret": appSecret });
req.session.dboxStore = {};
req.session.dboxStore.dboxApp = dboxApp;
dboxApp.requesttoken(function(status, request_token){
req.session.dboxStore.request_token = request_token;
console.log("request_token = ", request_token);
res.redirect('https://www.dropbox.com/1/oauth/authorize?oauth_token='+request_token.oauth_token+
'&oauth_callback=http://myhost.local/linksuccess/dropbox/'+memberId);
res.end;
});
},
linkSuccess : function(req, res){
var memberId = req.params.memberId;
var appKey = 'MYAPPKEY';
var appSecret = 'MYAPPSECRET';
var dbox = require('dbox');
var dboxApp = dbox.app({ "app_key": appKey, "app_secret": appSecret });
var request_token = req.session.dboxStore.request_token;
dboxApp.accesstoken(request_token, function(status, access_token){
console.log('access_token = ', access_token);
Member.setAuthToken(memberId, 'dropbox', access_token, function(err, member){
res.render('index', { title:'SUCCESSFUL DROPBOX AUTH' });
res.end;
});
});
}
关于node.js - 如何在 NodeJS/Express 中的页面刷新之间保留 node-dbox token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13211401/