2012-11-03 9 views
6

halten Im Versuch, eine kleine Anwendung mit NodeJS, node-dbox und Express zusammenzustellen. Wenn Sie für DropBox Autorisierung anfordern - it's a 3 step process, müssen Sie zunächst request_token erhalten, dann autorisiert Benutzer sie besuchen Dropbox-Seite, und nur dann Anfrage für access_token, basierend auf request_token und die Tatsache, dass der Benutzer autorisierte Anfrage hat.Wie man Knoten-dbox Token zwischen Seitenaktualisierungen in NodeJS/Express

jedoch von der Zeit war ich die Seite für Schritt 1 und 2 (immer request_token und die Bereitstellung Benutzer mit url) - request_token Beispiel ist weg !, so in Schritt 3 I nicht für ein access_token anfordern kann, weil es erfordert request_token wird übergeben

Ich versuche, request_token in einem Cookie zu speichern, aber vorausgesetzt, dass die vertraulichen Daten enthält, kann das Senden an den Client nicht so eine gute Idee sein. Irgendwelche Ideen?

Vereinfachte Code ist unten:

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

})(); 

Bonus-Frage: client erstellt mit access_token, also entweder Instanz von Client oder access_token gehalten werden müssen, über Seite als auch aktualisiert, was ist der beste Ansatz?

+0

Haben Sie jemals eine Lösung für diese bekommen? Ich kämpfe mit dem gleichen Ding - wie man von Dropbox zu meiner APP mit dem korrekten Zugangsmarker zurückleitet. – Lewis

Antwort

2

schaffte ich es, indem Sie die folgende Funktion zu erhalten:

Nach dem Dropbox Entwickler Referenz Sie wie gesagt es zusammen mit der Anforderung durch die Angabe hier eine Callback-URL zur Verfügung stellen können:

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

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

Durch Speichern des Anforderungs-Tokens in der Sitzung und Weiterleiten an die Rückruf-URL können Sie dann auf das Anforderungs-Token zugreifen und auf Ihrem Weg sein. Ein paar Route Handler Express, geleitet, um einen Mitglieds-ID als Parameter, auf Anfrage und behandelt dann die Antwort könnte wie folgt aussehen:

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; 
     }); 
     }); 
    } 
Verwandte Themen