Res.redirect вызывается дважды в обратном вызове Google для паспорта - я не могу понять, почему

Я использую passport.js как для Facebook, так и для Google auth. Стратегия аутентификации Facebook работает нормально, res.redirect в обратном вызове вызывается только один раз. Но из-за аутентификации Google я в растерянности, так как она вызывается дважды. Я потратил часы, пытаясь отладить это и изучая исходный код паспорта, но просто не могу найти ошибку.

Мой Google Auth просто получает некоторые контакты из Gmail.

app.get('/contacts/google', 
    passport.authenticate('google', { session: false, scope: ['profile', 'email', 'https://www.googleapis.com/auth/contacts.readonly'] })
);

app.get('/login/google/callback',

    passport.authenticate('google', { session: false, failureRedirect: '/' }), 
        function(req, res, next) {


           process.nextTick(function() {
              console.log("Right before the googletoken call", req.user);                         
              res.redirect("/users/" + '?googletoken=' + req.user.access_token );               
              });

        }
);

Стратегия Google

var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
var googleConfig = require('./googlekeys.js');

module.exports = function(passport) {

    passport.use('google', new GoogleStrategy({
        clientID        : googleConfig.appID,
        clientSecret    : googleConfig.appSecret,
        callbackURL     : googleConfig.callbackUrl,
        profileFields: ['email','profile']
        },

        // google will send back the tokens and profile
        function(access_token, refresh_token, profile, done) {

            process.nextTick(function() {
                //we send the token we receive back so we can use it to get the contacts
                console.log("Before calling the token callback");
                var user = {};
                user.access_token = access_token;
                return done(null, user);     

            });                
        }
    ));
};

А вот с консоли - проблема в том, что вызов /users/? Googletoken выполняется дважды, даже если console.log до этого вызывался только один раз.

GET /contacts/google 302 2.739 ms - 0
At the beginning
Before calling the token callback
Right before the googletoken call { access_token: '[GOOGLE TOKEN]' }
GET /login/google/callback?code=[CODE] 302 485.728 ms - 348
GET /users/?googletoken=[GOOGLE TOKEN THAT WAS RECEIVED BACK] 200 2.812 ms - 7791
GET /users/?googletoken=[GOOGLE TOKEN THAT WAS RECEIVED BACK] 304 1.575 ms - -

2 ответа

Подумав, наконец, попробовать в другом браузере, я обнаружил, что в Safari и Firefox проблем нет, поэтому похоже, что это Chrome Buck... и, глядя на https://bugs.chromium.org/p/chromium/issues/detail?id=64810 это старый, сейчас я проверяю, как это исправить.

У меня с ними такая же проблема. Но когда я посмотрел это и остановил adblock и проблема была исправлена.

Другие вопросы по тегам