2012-11-03 14 views
6

Sto cercando di mettere insieme una piccola applicazione usando NodeJS, node-dbox e Express. Quando si richiede l'autorizzazione DropBox - it's a 3 step process, è necessario prima ottenere request_token, quindi l'utente li autorizza a visitare la pagina dropbox e solo successivamente richiedere , basato su request_token e il fatto che l'utente abbia una richiesta autorizzata.Come mantenere il token del nodo-dbox tra gli aggiornamenti della pagina in NodeJS/Express

Tuttavia, per il momento ho servito la pagina per la fase 1 e 2 (ottenendo request_token, e fornendo all'utente url) - request_token esempio è andato !, così al punto 3 non posso richiedere un access_token, perché Richiede il passaggio request_token

Sto cercando di salvare request_token in un cookie, ma dato che contiene dati sensibili, inviarlo al cliente potrebbe non essere una buona idea. Qualche idea?

codice semplificata è qui sotto:

(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); 

})(); 

domanda bonus: client viene creato con access_token, quindi o istanza di client o access_token devono essere mantenuti in tutta pagina viene aggiornata così, che cosa è l'approccio migliore?

+0

Hai mai una soluzione a questo? Sto lottando con la stessa cosa - come reindirizzare di nuovo da Dropbox alla mia app con il token di accesso corretto. – Lewis

risposta

2

sono riuscito a farlo funzionare nel modo seguente:

Secondo il riferimento Developer Dropbox è possibile fornire un URL di richiamata specificando che insieme alla richiesta, come indicato qui:

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

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

Memorizzando il token di richiesta nella sessione e reindirizzando l'url di richiamata, è possibile accedere al token di richiesta ed essere sulla buona strada. Un paio di gestori di percorso Express, ha approvato una id utente come parametro, di richiedere e poi gestire la risposta potrebbe essere simile a questo:

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; 
     }); 
     }); 
    } 
Problemi correlati