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] Mé[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] [ .__ __.]
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.
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' ]
}));
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.