node.js - nodejs - passport js google oauth2
Node.js "passport-google-oauth2" entrega el error "no se pudo recuperar el perfil de usuario" en la aplicación Express (3)
Mientras desarrollaba el último ejemplo de un book introductorio de node.js (una aplicación express.js que utiliza la estrategia de autenticación de Google OpenID), después de reemplazar el paquete passport-google
(que quedó obsoleto el 20 de abril de 2015) con passport-google-oauth2
paquete passport-google-oauth2
(estrategia de autenticación de Google OAuth 2.0) y haber seguido las indicaciones en su página de documentación y un ejemplo aquí ; Recibí el siguiente error después de seleccionar mi cuenta de Google+, que fue lanzada por el módulo oath2.js
, concretamente llamando a this._oauth2.get("https://www.googleapis.com/plus/v1/people/me",...)
dentro del método userProfile(accessToken, done)
. El código fuente relacionado y las dependencias del módulo se encuentran a continuación.
¿Cuál podría ser la raíz del problema?
El error concreto es:
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)
El código de la aplicación relacionada es:
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 ^^ *****/
La aplicación tiene las siguientes dependencias:
[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] │ ├── [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] │ └─┬ [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] │ ├── [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]
Afortunadamente, encontré un problema similar en jaredhanson/passport-google-oauth , que me dio la idea de ir a la consola de proyectos de Google y simplemente habilitar la Google+ API
, que estaba "desactivada" (oh me !!, ingenuo desarrollador de Su primera aplicación basada en Google+). Esa fue la raíz del problema. Lo intenté de nuevo y el oauth2
comenzó a recibir perfiles correctamente.
El scope
que está utilizando está en desuso ahora:
passport.authenticate(''google'', { successRedirect: ''/'',scope:
[ ''https://www.googleapis.com/auth/userinfo.email'']})
);
En su lugar, debemos usar este:
passport.authenticate(''google'', { successRedirect: ''/'',scope:
[''email'']
}));
También puede obtener el profile scope
:
passport.authenticate(''google'', { successRedirect: ''/'',scope:
[ ''email'', ''profile'' ]
}));
Estoy usando Google OAuth 2.0 Playground y, en mi caso, el motivo de este error fue que mi token simplemente ha caducado. Refrescándolo en Playground resolvió el problema.