如何在NodeJS / Express的页面刷新之间保持node-dbox令牌

我试图用node-dboxnode-dboxExpress来组装一个小应用程序。 在请求DropBox授权时 – 这是一个3步的过程 ,首先需要获取request_token ,然后用户授权他们访问dropbox页面,然后根据request_token和用户授权请求的事实请求access_token

但是,当我服务第1步和第2步的页面(获取request_token ,并为用户提供url)时, request_token实例消失了,所以在第3步我不能请求access_token ,因为它需要传递request_token

我试图保存cookie中的request_token ,但由于包含敏感数据,发送给客户可能不是一个好主意。 有任何想法吗?

简码如下:

 (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创build,所以客户端或access_token实例都需要在页面刷新之间进行维护,最好的方法是什么?

我设法通过执行以下操作来实现它:

根据Dropbox开发人员参考,您可以提供一个callbackURL,通过指定它与请求一起在这里陈述:

https://www.dropbox.com/developers/blog/20

 https://www.dropbox.com/1/oauth/authorize?oauth_token=<request-token>&oauth_callback=<callback-url> 

通过将请求令牌存储在会话中并redirect到callbackURL,您可以访问请求令牌并随时待命。 几个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; }); }); }