web-dev-qa-db-fra.com

Node.js "passport-google-oauth2" délivre une erreur "échec de la récupération du profil utilisateur" dans l'application Express

Lors du développement du dernier exemple d’un node.js introductif livre (application express.js utilisant la stratégie d’authentification de Google OpenID), après avoir remplacé le paquet passport-google(obsolète le 20 avril 2015) avec le paquet passport-google-oauth2 (stratégie d'authentification de Google OAuth 2.0) et ayant suivi les indications données à page de sa documentation } et à exemple ici ; J'ai eu l'erreur ci-dessous après avoir sélectionné mon compte Google+, qui a été lancé par le module oath2.js, appelant concrètement this._oauth2.get("https://www.googleapis.com/plus/v1/people/me",...) dans la méthode userProfile(accessToken, done). Le code source associé et les dépendances de module sont ci-dessous. 

Quelle pourrait être la racine du problème?

L'erreur concrète est:

InternalOAuthError: failed to fetch user profile
    at <...>\web-app\b4\node_modules\passport-google-oauth2\lib\oauth2.js:92:28
    at passBackControl (<...>\web-app\b4\node_modules\passport-google-oauth2\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:124:9)
    at IncomingMessage.<anonymous> (<...>\web-app\b4\node_modules\passport-google-oauth2\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:143:7)
    at IncomingMessage.emit (events.js:129:20)
    at _stream_readable.js:908:16
    at process._tickCallback (node.js:355:11)

Le code de l'application associée est:

  passport = require('passport'),
  //...
  GoogleStrategy = require('passport-google-oauth2').Strategy; // #passport-google-oauth2
  //...
  /***** #passport-google-oauth2 vv *****/
  passport.use(new GoogleStrategy({
    clientID: "a_specific_value",
    clientSecret: "another_specific_value",
    callbackURL: "http://127.0.0.1:3000/auth/google/callback",
    passReqToCallback:true
  },
  function(request, accessToken, refreshToken, profile, done) {
      profile.identifier=profile.id;
      return done(null, profile);
  }
  ));
  /***** #passport-google-oauth2 ^^ *****/
  //...
  /*****  #passport-google-oauth2 vv    *****/
  app.get('/auth/google',
  passport.authenticate('google', { successRedirect: '/',scope:
    [ 'https://www.googleapis.com/auth/userinfo.email']})
  );
  app.get( '/auth/google/callback',
    passport.authenticate( 'google', {
        successRedirect: '/',
        failureRedirect: '/'
  }));
  /*****  #passport-google-oauth2 ^^    *****/    

L'application a les dépendances suivantes:

 [email protected] 
 [email protected] 
 [email protected] 
 │ └── ms @ 0.7.0 
 └── [email protected] 
 [email protected] 
 [email protected] 
 └── [email protected] 
 [email protected] 
 [email protected] 
 │ ┬ [email protected] 
 │ │ [email protected] 
 [email protected] 
 │ ├── [email protected] 
 │ ├── [email protected][email protected][email protected] 
 │ └── [email protected] 
 [email protected] 
 [email protected] 
 Debug @ 2.1.3 
 │ └── [email protected] 
 [email protected][email protected] 
 ├── [email protected] 
 │ ├── [email protected] 
 [email protected][email protected] 
 ├─┬ [email protected] 
 [email protected] 
 [email protected] 
 [email protected] 
 ├─┬ @ [email protected][email protected] 
 [email protected] 
 ├── ├── [email protected] 
 ├── [email protected] 
 ├─┬ [email protected] 
 ├── ├── [email protected] 
 │ └── [email protected] 
 [email protected] 
 ├─┬ [email protected] 
 ├── [email protected] 
 [email protected] 
 │ └── ms @ 0.7.0 
 ├── [email protected][email protected] 
 [email protected] 
 ├─┬ [email protected] 
 [email protected] 
 [email protected] 
 ├── passeport [email protected] 
 [email protected] 
 [email protected] 
 passport-oauth2 @ 1.1.2 
 │ Aut [email protected] 
 ├── [email protected] 
 [email protected] 
 [email protected]. 7 
 ├── [email protected] 
 [email protected] 
 [email protected] 
 [email protected] 
 ├── [email protected] 
 [email protected] 
 ├── [email protected]. 0 
 │ └─┬ courant combiné@0.0.7 
 Courant retardé@0.0.5 
 ├─┬ [email protected] 
 │ ├── [email protected] 
 [email protected] 
 [email protected] 
 [email protected] .4 
 ├─┬ [email protected] 
 [email protected] 
 [email protected] 
 └── [email protected] 
 [email protected] 
 [email protected] 
 Noeud [email protected] 
 ├── [email protected] 
 ├── [email protected] 
 [email protected] [ .__ __.] 
18
alesscor

Heureusement, j'ai trouvé un problème similaire sur jaredhanson/passport-google-oauth , ce qui m'a donné l'idée d'aller dans la console de projet de Google et d'activer simplement le Google+ API, qui a été "désactivé" (oh moi !!, développeur naïf de sa première application basée sur Google+). C'était la racine du problème. J'ai réessayé et le oauth2 a commencé à recevoir les profils correctement.

54
alesscor

La scope que vous utilisez est obsolète maintenant: 

passport.authenticate('google', { successRedirect: '/',scope:
  [ 'https://www.googleapis.com/auth/userinfo.email']})
);

Au lieu de cela, nous devons utiliser celui-ci:

passport.authenticate('google', { successRedirect: '/',scope:
  ['email']
}));

Vous pouvez également obtenir le profile scope:

passport.authenticate('google', { successRedirect: '/',scope:
  [ 'email', 'profile' ]
}));
7
Rémi Becheras

J'utilise Google OAuth 2.0 Playground et, dans mon cas, la raison de cette erreur était que mon jeton a simplement expiré. Le rafraîchissement dans Playground a résolu le problème.

0
1valdis