Каждый раз, когда я вхожу в тестовую учетную запись Google с помощью OAuth 2 и Passportjs, я получаю новый токен доступа и токен обновления

#node.js #passport.js #passport-google-oauth

Вопрос:

В проекте веб-сайта я разместил аутентификацию с помощью PassportJS в стратегии Google OAuth2, прежде чем пользователь сможет войти на веб-страницу, где он может отправлять электронные письма со своей учетной записью электронной почты. Из того, что я понял из прочитанного, у пользователя будет только 1 токен обновления, и токен доступа может обновляться каждый раз, когда он истекает.

Однако в своем проекте я заметил, что каждый раз, когда я запускаю приложение Nodejs и захожу на веб-сайт на локальном хосте, я каждый раз получаю другой токен обновления, который я проверял, регистрируя их в консоли. Меня беспокоит, как говорится в разделе Google Identity, токен обновления может перестать работать, если «Учетная запись пользователя превысила максимальное количество предоставленных (живых) токенов обновления». Мой код прямо сейчас получает новый токен обновления для каждого входа.

При этом нормально ли, что новый токен генерируется при каждом сеансе входа в систему, или его нужно исправить?

Ниже приведен код, который прослушивает запросы на аутентификацию Google, а также NodeMailer, который работает после авторизации пользователя в области, указанной в запросе:

   const express = require('express');
    const session = require('express-session');
    const passport = require('passport');
    const auth = require('./auth');
    
    
    function isLoggedIn(req, res, next) {
        req.user ? next() : res.sendStatus(401); 
    }   
    
    const app = express();
    
    // Middleware
    app.use(session({ secret: "cats" }));   //secret should be in an env var
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(express.static('public'));
    app.use(express.json());
    
    
    app.get('/', (req, res) => {
        res.send('<a href="/auth/google">Authenticate with Google</a>');
    });
   
    
    app.get('/auth/google', 
        passport.authenticate('google', {scope: ['https://mail.google.com/', 'profile', 'email'], accessType: 'offline', approvalPrompt: 'force'}) 

    
    app.get('/google/callback', 
        passport.authenticate('google', {
            successRedirect: '/protected',
            failureRedirect: '/auth/failure',
        })
    );
    
    app.get('/auth/failure', (req, res) => {
        res.send("Something went wrong!");
    });
    
    
    app.get('/protected', isLoggedIn, (req, res) => {   //the request contains information about the user
        res.send(`Hello ${req.user.profile.displayName}n<a href="/sendemails">Send E-mails</a>`);
    });
    
    app.get('/sendemails', isLoggedIn, (req, res) => {
        res.sendFile(__dirname   '/public/contactform.html');
    });
    
    app.get('/logout', (req, res) => {
        req.logout();
        req.session.destroy();
        res.send('Goodbye!');
    })


    app.post('/sendEmail', isLoggedIn, (req, res) => {

   
    const transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
            type: "OAuth2",
            user: req.user.profile.email,
            //pass: '20dollars'
            clientId: req.user.GOOGLE_CLIENT_ID,
            clientSecret: req.user.GOOGLE_CLIENT_SECRET,
            refreshToken: req.user.rToken,
            accessToken: req.user.token
        },
        // tls:{
        //     rejectUnauthorized:false
        // }
    });

    const mailOptions = {
        from: req.user.email,
        to: 'xxx@gmail.com',
        subject: `Message from ${req.user.email}: ${req.body.subject}`,
        text: req.body.message
    }

    transporter.sendMail(mailOptions, (error, info) =>{
        if(error){
            console.log(error);
            res.send('error');
        } else {
            console.log('Email sent: '   info.response);
            res.send('success')
        }
    })
})
 

В то время как ниже приведен код, содержащий стратегию Google OAuth для паспорта

 const passport = require('passport');
const GoogleStrategy = require( 'passport-google-oauth2' ).Strategy;

const GOOGLE_CLIENT_ID = 'xxx';
const GOOGLE_CLIENT_SECRET = 'xxx';

//Passport Strategy
passport.use(new GoogleStrategy({
    clientID:     GOOGLE_CLIENT_ID,
    clientSecret: GOOGLE_CLIENT_SECRET,
    callbackURL: "http://localhost:5000/google/callback", //App's authorized redirect URI; if user authenticates successfully, he gets redirected here
    passReqToCallback   : true
  },


  function(request, accessToken, refreshToken, profile, done) {
      
    return done(null, {token:accessToken, rToken:refreshToken, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, profile:profile});

  }
));

//Serialization and Deserialization

passport.serializeUser(function(user, done) {
    console.log(user)
    done(null, user);
});

passport.deserializeUser(function(user, done) {
    done(null, user);
})