3

ich diese npm Bibliothek bin mit - https://www.npmjs.com/package/googleapis und ich bin mit den folgenden Express Routen als /user/:Mit dem npm-Paket googleapis Wie erhalte ich die E-Mail-Adresse des Benutzers nach der Authentifizierung?

/* Redirect to the google login page */ 
    router.get('/login', function (req, res) { 
    res.redirect(auth.generateUrl()); 
    }); 

    /* The callback from the google OAuth API call */ 
    router.get('/callback', function (req, res) { 
    auth.authenticate(req.query.code); 

    res.send(); 
    }); 

Auth ist dieses Modul:

var oAuth2 = require('googleapis').auth.OAuth2; 

var oauth2Client = new oAuth2([CLIENT_ID], [CLIENT_SECRET], [DOMAIN] + '/user/callback'); 

module.exports = { 
    /** 
    * Generate a url to redirect to for authenticating via Google 
    * 
    * @return {String} 
    */ 
    generateUrl: function() { 
     return oauth2Client.generateAuthUrl({ 
      access_type: 'online', // 'online' (default) or 'offline' (gets refresh_token) 
      scope: ['https://www.googleapis.com/auth/userinfo.email'] // If you only need one scope you can pass it as string 
     }); 
    }, 
    authenticate: function (code) { 
     oauth2Client.getToken(code, function (err, tokens) { 
      console.log(err); 

      // Now tokens contains an access_token and an optional refresh_token. Save them. 
      if (!err) { 
       console.log(tokens); 

       oauth2Client.setCredentials(tokens); 
      } 
     }); 
    } 
}; 

Die authenticate Funktion auf die oberhalb basiert Beispiel in https://www.npmjs.com/package/googleapis#retrieve-access-token.

Jetzt, wenn ich gehe zu /user/login Ich sehe die Google-Login-Seite, die dann fragt mich um Erlaubnis. Ich habe den obigen E-Mail-Bereich verwendet, aber meine E-Mail-Adresse wird nicht im tokens Objekt angezeigt, das zurückgegeben wird. Dies ist, was ich bekomme:

{ access_token: '[72 length string]', 
    token_type: 'Bearer', 
    id_token: '[884 length string]', 
    expiry_date: [integer timestamp] } 

Ist dies nicht, wie die E-Mail-Adresse zu bekommen? Die Dokumentation ist nicht sehr klar und es gibt auch keine Beispiel-Tutorials, die ich online gefunden habe, da sie hauptsächlich mit einem bestimmten Service von Google, wie den Kalendern, zu tun haben. Ich bin nur an einer einfachen Authentifizierung interessiert. Ich kann keine anderen Methoden finden, die Bereichsinformationen in der Dokumentation abrufen können.

Ein kleiner Punkt auch, aber muss ich getToken() bei jeder Anfrage anrufen, wenn ein Benutzer angemeldet ist?

Edit:

Nach einigem Graben um im Code für die Bibliothek, fand ich diese:

this.userinfo = { 

    /** 
    * oauth2.userinfo.get 
    * 
    * @desc Get user info 
    * 
    * @alias oauth2.userinfo.get 
    * @memberOf! oauth2(v1) 
    * 
    * @param {object=} params - Parameters for request 
    * @param {callback} callback - The callback that handles the response. 
    * @return {object} Request object 
    */ 
    get: function(params, callback) { 
     var parameters = { 
     options: { 
      url: 'https://www.googleapis.com/oauth2/v1/userinfo', 
      method: 'GET' 
     }, 
     params: params, 
     requiredParams: [], 
     pathParams: [], 
     context: self 
     }; 

     return createAPIRequest(parameters, callback); 
    } 

Dies ist sowohl in node_modules/googleapis/apis/oauth2/v1.js und node_modules/googleapis/apis/oauth2/v1.js. Dies scheint jedoch nicht das zu sein, was require('googleapis').auth.OAuth2 verwendet, welches node_modules/google-auth-library/lib/auth/oauth2client.js ist. Gibt es eine Möglichkeit, auf userinfo.get zuzugreifen?

Weitere bearbeiten

ich dieses Tutorial gefunden - https://www.theodo.fr/blog/2014/06/dont-bother-with-keys-open-your-door-with-google-api/, diesen Abschnitt davon (am unteren Rand der Seite) ist genau das, was ich tun möchte:

googleapis.discover('oauth2', 'v1').execute(function(err, client) { 
    if (!err) { 
     client.oauth2.userinfo.get().withAuthClient(oauth2Client).execute(function(err, results) { 
      var email = results.email; 

      if ((email.indexOf('theodo.fr') + 'theodo.fr'.length) != email.length) { 
       return res.send({ 
        status: -1, 
        message: "Google Plus authentication failed (domain mismatch)" 
       }); 
      } 

      doorClient.open(); 

      res.send({ 
       status: 0, 
       message: 'Door opened. Welcome !' 
      }); 
     }); 
    } 
}); 

abgesehen von der absoluten lächerliche Ausführlichkeit von Googles API, funktioniert dieser Code nicht mehr. discover ist nicht mehr eine Funktion, also habe ich keine Ahnung, wie auf v1 oder v2 zugreifen, die die userinfo.get Funktion enthalten, die ich brauche.

+0

Wenn jemand anderes in dieses Problem läuft, gab ich auf und verwendet Pass mit dem Google oauth Strategie statt - https: //www.npmjs.com/package/pass-google-oauth20 – Gnuffo1

Antwort

7

Mit der Version, die ich gerade nicht haben, die 2.1.6 ist, so, wie es Arbeit zu machen ist:

googleapis.oauth2("v2").userinfo.v2.me.get({auth: oauth2Client}, (e, profile) => { 
    ... 
}); 

Ich habe in den Quellcode zu sah, um herauszufinden, wie es zu tun, und ich Bin mir nicht 100% sicher, ob das der beste Weg ist, denn ich muss "v2" zweimal erwähnen. Aber es funktioniert für mich.

+0

sollten Sie wählen, ob Sie '=>' oder 'function' für den Rückruf verwenden, so sollte es aussehen wie' googleapis.oauth ("v2"). userinfo.v2.me.get ({auth: oauth2Client}, (e, Profil) => {...}); ' –

+0

@AndrewStroup Es ist ein Tippfehler, ich habe es korrigiert. Danke, dass du es aufgezeigt hast – Comtaler

1

Meine Lösung:

const google = require('googleapis'); 

const oauth2 = google.oauth2('v2'); 
const OAuth2 = google.auth.OAuth2; 

exports.getUserInfo = (accessToken) => { 
    // CLIENT_ID and CLIENT_SECRET are optional 
    const authClient = new OAuth2(/* CLIENT_ID, CLIENT_SECRET */); 

    authClient.setCredentials({ 
    access_token: accessToken, 
    }); 

    return new Promise((resolve, reject) => { 
    oauth2.userinfo.get({ 
     auth: authClient, 
    }, (err, data) => (err ? reject(err) : resolve(data))); 
    }); 
};