Google Oauth donnant une erreur de code échangé

Bonjour, je travaille sur un projet dans lequel un utilisateur se connecte via un compte Google. (Localhost) J’ai implémenté l’inscription Google. Dès que je me connecte à partir de mon compte, l’erreur ci-dessous apparaît.

TokenError: Code was already redeemed. at Strategy.OAuth2Strategy.parseErrorResponse (c:\Projects\Internship_rideshare\node_modules\passport-google-oauth\node_modules\passport-oauth\node_modules\passport-oauth2\lib\strategy.js:298:12) at Strategy.OAuth2Strategy._createOAuthError (c:\Projects\Internship_rideshare\node_modules\passport-google-oauth\node_modules\passport-oauth\node_modules\passport-oauth2\lib\strategy.js:345:16) at c:\Projects\Internship_rideshare\node_modules\passport-google-oauth\node_modules\passport-oauth\node_modules\passport-oauth2\lib\strategy.js:171:43 at c:\Projects\Internship_rideshare\node_modules\passport-google-oauth\node_modules\passport-oauth\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:176:18 at passBackControl (c:\Projects\Internship_rideshare\node_modules\passport-google-oauth\node_modules\passport-oauth\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:123:9) at IncomingMessage. (c:\Projects\Internship_rideshare\node_modules\passport-google-oauth\node_modules\passport-oauth\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:142:7) at IncomingMessage.emit (events.js:129:20) at _stream_readable.js:908:16 at process._tickCallback (node.js:355:11) 

Mon code est le suivant (extrait pour la connexion à Google): –

 passport.use(new GoogleStrategy(google, function(req, accessToken, refreshToken, profile, done) { if (req.user) { User.findOne({ google: profile.id }, function(err, existingUser) { if (existingUser) { console.log('There is already a Google+ account that belongs to you. Sign in with that account or delete it, then link it with your current account.' ); done(err); } else { User.findById(req.user.id, function(err, user) { user.google = profile.id; user.tokens.push({ kind: 'google', accessToken: accessToken }); user.profile.displayName = user.profile.displayName || profile.displayName; user.profile.gender = user.profile.gender || profile._json.gender; //user.profile.picture = user.profile.picture || 'https://graph.facebook.com/' + profile.id + '/picture?type=large'; user.save(function(err) { console.log('Google account has been linked.'); done(err, user); }); }); } }); } else { User.findOne({ google: profile.id }, function(err, existingUser) { if (existingUser) return done(null, existingUser); User.findOne({ email: profile._json.email }, function(err, existingEmailUser) { if (existingEmailUser) { console.log('There is already an account using this email address. Sign in to that account and link it with Google manually from Account Settings.' ); done(err); } else { var user = new User(); user.email = profile._json.email; user.google = profile.id; user.tokens.push({ kind: 'google', accessToken: accessToken }); user.profile.displayName = profile.displayName; user.profile.gender = profile._json.gender; //user.profile.picture = 'https://graph.facebook.com/' + profile.id + '/picture?type=large'; user.profile.location = (profile._json.location) ? profile._json.location.name : ''; user.save(function(err) { done(err, user); }); } }); }); } })); 

Je suis coincé dessus.Veuillez m’aider .. merci

Le problème ne réside pas dans votre “extrait”, regardez les itinéraires. Il devrait s’agir d’un chemin absolu sur la redirection pour Google.

 router.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '#/signIn' }), function(req, res) { // absolute path res.redirect('http://localhost:8888/#/home'); }); 

C’est un problème connu, suivez ce lien vers d’autres solutions: https://github.com/jaredhanson/passport-google-oauth/issues/82.

J’ai rencontré ce problème. Le problème exact est votre itinéraire.

 app.get('/auth/google/callback', passport.authenticate('google'), (req, res) => { res.send('get the data'); }); 

À ce stade, l’application avait obtenu l’autorisation de l’utilisateur et Google envoyait un code à cette URL. Maintenant, quel passeport fait ici, il a pris ce code et a demandé à Google de fournir les détails de l’utilisateur et l’a obtenu de Google. Maintenant, nous devons faire quelque chose avec ces détails, sinon vous obtiendrez l’erreur que vous avez.

Nous pouvons maintenant utiliser serialiseUser et deserialiseUser of passport pour enregistrer les détails dans un cookie et éditer une ligne du code ci-dessus pour aller à une URL telle que celle-ci.

 app.get('/auth/google/callback', passport.authenticate('google'), (req, res) => { res.redirect('/servey'); // just a url to go somewhere }); 

J’ai aussi eu le même problème depuis quelques jours. Ce que j’ai compris, c’est que vous devez juste compléter le processus. Jusqu’à présent, vous avez seulement vérifié si l’utilisateur est présent ou non dans la firebase database. Sinon, vous enregistrez l’utilisateur dans la firebase database.

Cependant, après cela, lorsque Google tente de redirect l’utilisateur, le code envoyé par Google + API est déjà utilisé ou indique qu’il n’est plus disponible. Ainsi, lorsque vous vérifiez l’utilisateur dans votre firebase database, vous devez le sérialiser, c’est-à-dire stocker le code dans votre navigateur dans un cookie pour que, lorsque Google le redirige, il sache qui il est. Cela peut être fait en ajoutant le code donné ci-dessous.

 //add this in current snippet passport.serializeUser(function(user,done){ done(null,user.id); }); 

Pour utiliser ce cookie, vous devez désérialiser l’utilisateur. Pour désérialiser, utilisez le code donné ci-dessous.

 //add this in current snippet passport.deserializeUser(function(id,done){ User.findById(id).then(function(user){ done(null, user); }); }); 

En outre, vous devez démarrer une session de cookie et vous pouvez le faire en ajoutant le code ci-dessous dans votre fichier principal app.js.

 const cookieSession = require('cookie-session'); app.use(cookieSession({ maxAge: 24*60*60*1000, // age of cookie, the value is always given in milliseconds keys:[keys.session.cookiekey] })); //initialize passport app.use(passport.initialize()); app.use(passport.session()); 

Notez que vous devez avoir besoin du package cookie-session. Installez-le en utilisant

 npm install cookie-session 

En outre, vous devez écrire l’URI absolu dans la propriété callbackURL dans votre stratégie Google.

J’ai eu le même problème.

La réinitialisation du secret du client depuis la console Google a résolu le problème.