double passport connexion twitter and discord

18 views Asked by At

I am currently facing a significant issue. My frontend is built with Next.js, and my backend for the API is powered by Express. I'm implementing a dual authentication system where users need to be connected both with Discord and Twitter.

Ideally, when both connections are successfully established, I should have two separate cookies for each service. However, the problem I'm encountering is that the value of the Twitter cookie is somehow being stored in the value of the Discord cookie. I'm really puzzled as to why this is happening.

MY CODE

middleware discord

require('dotenv').config();
const passport = require('passport');
const DiscordStrategy = require('passport-discord').Strategy;
const {Profile} = require('passport-discord');
//const { DiscordUser, FrontUser } = require('../models');
const DiscordUser = require('../models/DiscordUser');
const FrontUser = require('../models/FrontUser');

const token = process.env.AUTH0_CLIENT_SECRET;
const client = process.env.AUTH0_CLIENT_ID;

passport.serializeUser((user, done) => {
  done(null, user.id);
});




passport.deserializeUser(async (id, done) => {
  try {
    let user = await DiscordUser.findById(id);
    
    if (!user.frontuser || user.frontuser.length === 0) {
      const frontUser = await FrontUser.findOne({ discordUserId: id });
      
      if (frontUser) {
        user.frontuser = [frontUser._id];
        await user.save();
      }
    }

    user = await DiscordUser.findById(id).populate('frontuser');
    //console.log('1',user.frontuser._id, user.frontuser[0].publicKey); // Affiche les informations de l'utilisateur
    if(user.frontuser !== null) {
      if (user.frontuser.length > 0) {
        const frontUser = user.frontuser[0];
        user.frontuser._id = frontUser._id;
        user.frontuser.publicKey = frontUser.publicKey;
        user.frontuser.gold = frontUser.gold;
        //console.log('2',user.frontuser.publicKey, user.frontuser[0].publicKey);
      }
    }

    //console.log('User:', user); // Affiche les informations de l'utilisateur

    done(null, user);
  } catch (err) {
    done(err, null);
  }
});


passport.use(
  new DiscordStrategy(
    {
      clientID: client,
      clientSecret: token,
      callbackURL: 'http://localhost:3001/api/v1/auth/discord/redirect',
      scope: ['identify', 'email'],
    },
    async (
      accessToken,
      refreshToken, 
      profile,
      done) => {
      
      
      
      try {
        const { id, username, discriminator, email } = profile;
        const findUser = await DiscordUser.findOne({ discordId: id });
        if (findUser) {
          findUser.accessToken = accessToken;
          findUser.refreshToken = refreshToken;
        
          await findUser.save();
          
          return done(null, findUser);
        } else {
          const newUser = await DiscordUser.create({
            discordId: id,
            username,
            email,
            accessToken,
            refreshToken,
            frontuser:null
          
          });
     
          return done(null, newUser);
        }
      } catch (err) {
        console.error(err);
        return done(err, null);
      }
    }
  )
);
// Enregistre l'ID de l'utilisateur Frontend correspondant dans la table DiscordUser
/*console.log('d',DiscordUser._id);
FrontUser.findOne({discordUserId : DiscordUser._id })
.then((frontUser) => {
  console.log('FrontUser:', frontUser);
  const get_id = frontUser._id; // Affiche les informations de l'utilisateur
  DiscordUser.frontUserId =  get_id;
  DiscordUser.save();
});*/

module.exports = passport;

middleware twitter

const passport = require('passport');
const TwitterStrategy = require('passport-twitter').Strategy;
const TwitterUser = require('../models/TwitterUser');

// Configure l'authentification Twitter
passport.use(new TwitterStrategy({
  consumerKey: process.env.CONSUMER_TWITTER_KEY,
  consumerSecret: process.env.CONSUMER_TWITTER_KEY_SECRET,
  callbackURL: process.env.CALLBACK_TWITTER,
}, async(
    token, 
    tokenSecret, 
    profile, 
    done) => {

    //console.log(profile);

    try {
        const {id, _json} = profile;
        const name = _json.name;
        const screen_name = _json.screen_name;
        const followers_count = _json.followers_count;
        const findUser = await TwitterUser.findOne({twitterId: id});

        if(findUser){
          findUser.token = token;
          findUser.tokenSecret = tokenSecret;
        
          await findUser.save();

          return done(null, findUser);
        } else {

          //console.log('pofileTest',id,name, screen_name,followers_count)
          const newUser = await TwitterUser.create({
            twitterId: id,
            userName: name,
            screenName: screen_name,
            followersCount: followers_count,
            token: token,
            tokenSecret: tokenSecret

          });
          return done(null, newUser);
        }
    } catch (error) {
      console.error(error);
      return done(error, null);
    }

}));

// Sérialise l'utilisateur dans la session
passport.serializeUser((user, done) => {
  done(null, user.id);
});

// Désérialise l'utilisateur à partir de la session
passport.deserializeUser(async(id, done) => {
  // Vous pouvez utiliser l'ID de l'utilisateur pour récupérer les informations de l'utilisateur depuis la base de données
  // done(null, user);

  try {
    
    let user = await TwitterUser.findById(id);

    done(null,user)

  } catch (error) {
    done(error, null);
  }
});

module.exports = passport;

appDiscord

// appDiscord.js

const session = require('express-session');
const MongoStore = require('connect-mongo');
require('./middleware/discord');



const discordSession =

  session({
    secret: process.env.SESSION_SECRET_DISCORD,
    resave: false,
    saveUninitialized: false,
    cookie: {
      maxAge: 6000 * 60 * 24 * 7,
    },
    store: MongoStore.create({
      mongoUrl: 'mongodb+srv://cedaffair:[email protected]/test',
      collectionName: 'sessionDiscord'
    }),
    name: 'discordConnect',
  });


// ... autres configurations spécifiques à Discord

module.exports = discordSession;

appTwitter

// appTwitter.js

const session = require('express-session');
const MongoStore = require('connect-mongo');
require('./middleware/twitter');




const twitterSession =  session({
    secret: process.env.SESSION_SECRET_TWITTER,
    resave: false,
    saveUninitialized: false,
    cookie: {
      maxAge: 6000 * 60 * 24 * 7,
    },
    store: MongoStore.create({
      mongoUrl: 'mongodb+srv://cedaffair:[email protected]/test',
      collectionName: 'sessionTwitter'
    }),
    name: 'twitterConnect',
  })


// ... autres configurations spécifiques à Twitter

module.exports = twitterSession;

The file appDiscord and appTwitter are charge in app.js

my file app.js

require('dotenv').config();
const passport = require('passport');
const DiscordStrategy = require('passport-discord').Strategy;
const {Profile} = require('passport-discord');
//const { DiscordUser, FrontUser } = require('../models');
const DiscordUser = require('../models/DiscordUser');
const FrontUser = require('../models/FrontUser');

const token = process.env.AUTH0_CLIENT_SECRET;
const client = process.env.AUTH0_CLIENT_ID;

passport.serializeUser((user, done) => {
  done(null, user.id);
});




passport.deserializeUser(async (id, done) => {
  try {
    let user = await DiscordUser.findById(id);
    
    if (!user.frontuser || user.frontuser.length === 0) {
      const frontUser = await FrontUser.findOne({ discordUserId: id });
      
      if (frontUser) {
        user.frontuser = [frontUser._id];
        await user.save();
      }
    }

    user = await DiscordUser.findById(id).populate('frontuser');
    //console.log('1',user.frontuser._id, user.frontuser[0].publicKey); // Affiche les informations de l'utilisateur
    if(user.frontuser !== null) {
      if (user.frontuser.length > 0) {
        const frontUser = user.frontuser[0];
        user.frontuser._id = frontUser._id;
        user.frontuser.publicKey = frontUser.publicKey;
        user.frontuser.gold = frontUser.gold;
        //console.log('2',user.frontuser.publicKey, user.frontuser[0].publicKey);
      }
    }

    //console.log('User:', user); // Affiche les informations de l'utilisateur

    done(null, user);
  } catch (err) {
    done(err, null);
  }
});


passport.use(
  new DiscordStrategy(
    {
      clientID: client,
      clientSecret: token,
      callbackURL: 'http://localhost:3001/api/v1/auth/discord/redirect',
      scope: ['identify', 'email'],
    },
    async (
      accessToken,
      refreshToken, 
      profile,
      done) => {
      
      
      
      try {
        const { id, username, discriminator, email } = profile;
        const findUser = await DiscordUser.findOne({ discordId: id });
        if (findUser) {
          findUser.accessToken = accessToken;
          findUser.refreshToken = refreshToken;
        
          await findUser.save();
          
          return done(null, findUser);
        } else {
          const newUser = await DiscordUser.create({
            discordId: id,
            username,
            email,
            accessToken,
            refreshToken,
            frontuser:null
          
          });
     
          return done(null, newUser);
        }
      } catch (err) {
        console.error(err);
        return done(err, null);
      }
    }
  )
);
// Enregistre l'ID de l'utilisateur Frontend correspondant dans la table DiscordUser
/*console.log('d',DiscordUser._id);
FrontUser.findOne({discordUserId : DiscordUser._id })
.then((frontUser) => {
  console.log('FrontUser:', frontUser);
  const get_id = frontUser._id; // Affiche les informations de l'utilisateur
  DiscordUser.frontUserId =  get_id;
  DiscordUser.save();
});*/

module.exports = passport;

And for finish the roads

require('dotenv').config();
const express = require('express');
const passport = require('passport');
const isAuthenticated = require('../../middleware/authorized');
const router = express.Router();
const FrontUser = require('../../models/FrontUser');
const DiscordUser = require('../../models/DiscordUser');


router.get('/discord', passport.authenticate('discord'),(req, res) => {
    res.status(200)
  });

router.get('/discord/redirect', passport.authenticate('discord',{
  failureRedirect:'http://localhost:3000/'}), (req, res) => {
  res.redirect('http://localhost:3000/');
});


// Définition de la route d'authentification Twitter
router.get('/twitter', passport.authenticate('twitter'),(req, res) => { 
    res.status(200);
});

// Callback après l'authentification Twitter
router.get('/twitter/redirect', passport.authenticate('twitter', {
  failureRedirect:'http://localhost:3000/'}), (req, res) => {
  res.redirect('http://localhost:3000/');
});

module.exports = router;

I sincerely appreciate any assistance you can provide as I'm currently stuck on this issue. Thank you in advance for your help.

0

There are 0 answers