node.js - 如何在 NodeJS/Express 中的页面刷新之间保留 node-dbox token

标签 node.js express dropbox

我正在尝试使用 NodeJSnode-dboxExpress 组合一个小应用程序。 请求 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/

相关文章:

node.js - 如何让 node-sass watch 和 live reload 从单个 NPM 脚本运行?

node.js - 如何更新 mongoose db 中的 2 个或更多唯一文档

ios - 在不同团队之间共享 Xcode 项目

node.js - 更新mongoDB文档需要两次

node.js - 无法使用 coinbase pro api 检索某些信息(订单历史记录、交易账户)

node.js - 如何使用 mongoose Controller 路由将两个 mongodb 集合连接在一起?

javascript - NodeJS 存储模块功能结果

javascript - 使用 javascript api 显示 dropbox 中的图像

python - 下载 Dropbox 文件夹中的所有 .mp4 文件

node.js - 如何在 Mocha 单元测试中使用 Mongoose ?