2016-11-15 4 views
0

Nach Ausgaben von fast einer Woche versucht, Pass-Strategie für Google-Token erfolglos zu implementieren, entschied ich mich selbst schreiben mit der Nodejs-Client-Bibliothek für Google API. Ich übergebe den accesstoken von angularjs in einer $ http-Anfrage und möchte den angemeldeten Benutzer nach der Authentifizierung auf der Serverseite an den Anruf zurückgeben. Ich habe Probleme bei der Übergabe des angemeldeten Benutzers an das req-Objekt, damit ich es an die nächste Middleware weitergeben kann. Jede Hilfe wird sehr geschätzt.Express Manipulieren req Objekt, um zur nächsten Middleware

**express code** 

Router

var gCtrl = require('./googleController.js'); 
app.post('/auth/google/accesstoken', 


     function (req, res) { 
     console.log('Im in the google auth middleware'); 

    //below line is not returning the gUser so I can pass it to the next middleware 
     var gUser=gCtrl(req.token); 

     res.send(gUser); 
}, 
function(req,res){ 
    //do something with authenticated user 
    } 
); 

GCTRL Modul, das die Google-API-Aufruf

var ubCust = require('../models/ubCust.js'); 
var bodyParser = require('body-parser'); 

var google=require('googleapis'); 
var plus = google.plus('v1'); 
var OAuth2 = google.auth.OAuth2; 
var oauth2client = new OAuth2('1094664898379-8u0muh9eme8nnvp95dafuc3rvigu4j9u.apps.googleusercontent.com','KQ_vNDaZzTvXDdsfgp5jqeZW','http://localhost:3000/auth/google/callback'); 


module.exports = function(acc_token){ 


     //console.log(acc_token); 
     oauth2client.setCredentials({ 
      access_token : acc_token 
     //refresh_token: token.refresh_token 
     }); 

     plus.people.get({ 
      userId:'me', 
      auth:oauth2client 
     },function(err,response){ 
      if (err) 
       throw err; 
      //console.log('google user',response); 
      return response; 
     }); 

    }; 
+0

Hat req.token einen Wert? –

Antwort

2

Sie vermissen ein Verständnis davon, wie man gibt Werte von einem asynchronen Betrieb macht. Wo Sie return response in Ihrem gCtrl-Modul haben, wird nur der Wert intern zurückgegeben, was auch immer der asynchrone Vorgang in plus.people.get() ist. Das wird den Wert von Ihrer module.exports Funktion nicht zurückgeben. Diese Funktion ist schon lange zurück.

Sie können über das allgemeine Konzept der Rückgabe von Werten aus einer asynchronen Operation hier lesen: How do I return the response from an asynchronous call?. Sie müssen entweder eine Callback-Funktion oder ein Versprechen verwenden, um einen asynchronen Wert zurückzugeben. Sie können es nicht direkt zurückgeben.

nun in Ihrem speziellen Fall, könnten Sie Ihre gCtrl Modul als Express Middleware verwenden, wo Sie den Zwischentokenwert in das req Objekt in Ihren Middleware-Handler gesetzt und dann next() verwenden, um zu kommunizieren, dass es jetzt an der Zeit Ihren Haupt Handler aufrufe für die Anfrage. Sie können wie folgt tun:

// gtrl - Express middleware handler 
// the purpose of this middleware is to process req.token 
// and set req.tokenResponse for further processing 
// in the next step of the middleware/request handler processing 
module.exports = function(req, res, next) { 
    oauth2client.setCredentials({ 
     access_token : req.token 
    //refresh_token: token.refresh_token 
    }); 

    plus.people.get({ 
     userId:'me', 
     auth:oauth2client 
    }, function(err,response){ 
     if (err) { 
      // communicate back error in some fashion, may want to return a 5xx response for an internal error 
      next(err); 
     } else { 
      // set value into req object for later consumption 
      req.tokenResponse = response; 
      // call next handler in the chain 
      next(); 
     } 
    }); 
    }; 

// router 
var gCtrl = require('./googleController.js'); 

// use gCtrl middleware to do async processing on req.token 
app.post('/auth/google/accesstoken', gCtrl, function(req, res) { 
    // req.tokenResponse is set here by the gCtrl middleware 
    // do something with authenticated user 

    // send some sort of response here 
    res.send(...); 
}); 

Hinweis: diese Arbeit zu machen, haben wir die gCtrl exportierte Funktion entspricht die Funktionssignatur von Express Middleware speziell zu machen und ruft die Token direkt aus dem req Objekt. Sie könnten das Modul gCtrl von Express unabhängig machen und es zu einer asynchronen Funktion machen, die einen Rückruf oder eine Zusage verwendet, um zurück zu kommunizieren, wenn es Daten hat, und dann den Express-Handler so zu codieren, dass er diese Funktion aufruft und diesen asynchronen Rückgabewert verwendet. In meinem Code oben wählte ich die bereits erstellte Middleware-Architektur für die Behandlung der asynchronen Antwort.

Verwandte Themen