Двойная паспортная связь, Twitter и Discord ⇐ Javascript
Двойная паспортная связь, Twitter и Discord
В настоящее время я столкнулся с серьезной проблемой. Мой интерфейс создан на основе Next.js, а серверная часть API — на платформе Express. Я реализую систему двойной аутентификации, в которой пользователям необходимо подключаться как к Discord, так и к Twitter.
В идеале, когда оба соединения успешно установлены, у меня должно быть два отдельных файла cookie для каждой службы. Однако проблема, с которой я столкнулся, заключается в том, что значение файла cookie Twitter каким-то образом сохраняется в значении файла cookie Discord. Я очень озадачен, почему это происходит.
МОЙ КОД
разногласия в промежуточном программном обеспечении
require('dotenv').config(); const паспорт = require('паспорт'); const DiscordStrategy = require('passport-discord').Strategy; const {Профиль} = require('passport-discord'); //const { DiscordUser, FrontUser } = require('../models'); const DiscordUser = require('../models/DiscordUser'); const FrontUser = require('../models/FrontUser'); константный токен = процесс.env.AUTH0_CLIENT_SECRET; константный клиент = процесс.env.AUTH0_CLIENT_ID; паспорт.serializeUser((пользователь, готово) => { сделано (нуль, user.id); }); паспорт.deserializeUser(async (id, готово) => { пытаться { пусть пользователь = ждут DiscordUser.findById(id); if (!user.frontuser || user.frontuser.length === 0) { const frontUser = await FrontUser.findOne({discordUserId: id}); если (frontUser) { user.frontuser = [frontUser._id]; дождитесь пользователя.save(); } } пользователь = ждут DiscordUser.findById(id).populate('frontuser'); //console.log('1',user.frontuser._id, user.frontuser[0].publicKey); // Добавление информации о пользователе если (user.frontuser !== ноль) { если (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('Пользователь:', пользователь); // Добавление информации о пользователе сделано (ноль, пользователь); } поймать (ошибиться) { сделано (ошибка, ноль); } }); паспорт.использовать( новая DiscordStrategy( { идентификатор клиента: клиент, clientSecret: токен, URL-адрес обратного вызова: 'http://localhost:3001/api/v1/auth/discord/redirect', область действия: ['идентифицировать', 'электронная почта'], }, асинхронный ( токен доступа, обновитьТокен, профиль, готово) => { пытаться { const {id, имя пользователя, дискриминатор, адрес электронной почты} = профиль; const findUser = await DiscordUser.findOne({discordId: id}); если (найтиПользователь) { findUser.accessToken = accessToken; findUser.refreshToken =refreshToken; дождитесь findUser.save(); возврат выполнен (нуль, findUser); } еще { const newUser = ждут DiscordUser.create({ дискордид: идентификатор, имя пользователя, электронная почта, токен доступа, обновитьТокен, передний пользователь: нуль }); возвращение выполнено (нуль, newUser); } } поймать (ошибиться) { console.error(ошибка); возврат выполнен (ошибка, ноль); } } ) ); // Регистрация идентификатора пользователя, соответствующего интерфейсному пользователю, в таблице DiscordUser /*console.log('d',DiscordUser._id); FrontUser.findOne({discordUserId : DiscordUser._id }) .then((frontUser) => { console.log('FrontUser:', frontUser); const get_id = frontUser._id; // Добавление информации о пользователе DiscordUser.frontUserId = get_id; DiscordUser.save(); });*/ модуль.экспорт = паспорт; Промежуточное программное обеспечение Twitter
const Passport = require('passport'); const TwitterStrategy = require('passport-twitter').Strategy; const TwitterUser = require('../models/TwitterUser'); // Настройка аутентификации Twitter паспорт.use(новый TwitterStrategy({ ConsumerKey:process.env.CONSUMER_TWITTER_KEY, потребительскийсекрет: процесс.env.CONSUMER_TWITTER_KEY_SECRET, URL-адрес обратного вызова:process.env.CALLBACK_TWITTER, }, асинхронный( токен, токенСекрет, профиль, готово) => { //console.log(профиль); пытаться { const {id, _json} = профиль; константное имя = _json.name; const screen_name = _json.screen_name; const Followers_count = _json.followers_count; const findUser = await TwitterUser.findOne({twitterId: id}); если (найтиПользователя) { findUser.token = токен; findUser.tokenSecret = tokenSecret; дождитесь findUser.save(); возврат выполнен (нуль, findUser); } еще { //console.log('pofileTest',id,name, screen_name,followers_count) const newUser = await TwitterUser.create({ твиттерИд: идентификатор, Имя пользователя: имя, имя_экрана: имя_экрана, последователиCount: последователи_count, жетон: жетон, токенсекрет: токенсекрет }); возвращение выполнено (нуль, newUser); } } поймать (ошибка) { console.error(ошибка); возврат выполнен (ошибка, ноль); } })); // Сериализация пользователя в сеансе паспорт.serializeUser((пользователь, готово) => { сделано (нуль, user.id); }); // Десериализация пользователя в части сеанса паспорт.deserializeUser(async(id, Done) => { // Вы можете использовать идентификатор пользователя для получения информации о пользователе из базы данных // готово (нуль, пользователь); пытаться { пусть пользователь = ждут TwitterUser.findById(id); сделано (нуль, пользователь) } поймать (ошибка) { сделано (ошибка, ноль); } }); модуль.экспорт = паспорт; appDiscord
// appDiscord.js const session = require('экспресс-сессия'); const MongoStore = require('connect-mongo'); require('./middleware/discord'); const discordSession = сессия({ секрет: процесс.env.SESSION_SECRET_DISCORD, пересохранить: ложь, saveUninitialized: ложь, печенье: { МаксВозраст: 6000*60*24*7, }, магазин: MongoStore.create({ mongoUrl: 'mongodb+srv://cedaffair:aNE51Cj9k25nPaFI@cluster0.uy7w7ps.mongodb.net/test', Имя коллекции: 'sessionDiscord' }), имя: 'discordConnect', }); // ... другие конфигурации, специфичные для Discord модуль.экспорт = discordSession; appTwitter
// appTwitter.js const session = require('экспресс-сессия'); const MongoStore = require('connect-mongo'); require('./middleware/twitter'); const twitterSession = сеанс({ секрет: процесс.env.SESSION_SECRET_TWITTER, пересохранить: ложь, saveUninitialized: ложь, печенье: { МаксВозраст: 6000*60*24*7, }, магазин: MongoStore.create({ mongoUrl: 'mongodb+srv://cedaffair:aNE51Cj9k25nPaFI@cluster0.uy7w7ps.mongodb.net/test', Имя коллекции: 'sessionTwitter' }), имя: «twitterConnect», }) // ... другие специфические конфигурации в Twitter модуль.экспорт = twitterSession; Файл appDiscord и appTwitter оплачиваются в app.js
мой файл app.js
require('dotenv').config(); const паспорт = require('паспорт'); const DiscordStrategy = require('passport-discord').Strategy; const {Профиль} = require('passport-discord'); //const { DiscordUser, FrontUser } = require('../models'); const DiscordUser = require('../models/DiscordUser'); const FrontUser = require('../models/FrontUser'); константный токен = процесс.env.AUTH0_CLIENT_SECRET; константный клиент = процесс.env.AUTH0_CLIENT_ID; паспорт.serializeUser((пользователь, готово) => { сделано (нуль, user.id); }); паспорт.deserializeUser(async (id, готово) => { пытаться { пусть пользователь = ждут DiscordUser.findById(id); if (!user.frontuser || user.frontuser.length === 0) { const frontUser = await FrontUser.findOne({discordUserId: id}); если (frontUser) { user.frontuser = [frontUser._id]; дождитесь пользователя.save(); } } пользователь = ждут DiscordUser.findById(id).populate('frontuser'); //console.log('1',user.frontuser._id, user.frontuser[0].publicKey); // Добавление информации о пользователе если (user.frontuser !== ноль) { если (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('Пользователь:', пользователь); // Добавление информации о пользователе сделано (ноль, пользователь); } поймать (ошибиться) { сделано (ошибка, ноль); } }); паспорт.использовать( новая DiscordStrategy( { идентификатор клиента: клиент, clientSecret: токен, URL-адрес обратного вызова: 'http://localhost:3001/api/v1/auth/discord/redirect', область действия: ['идентифицировать', 'электронная почта'], }, асинхронный ( токен доступа, обновитьТокен, профиль, готово) => { пытаться { const {id, имя пользователя, дискриминатор, адрес электронной почты} = профиль; const findUser = await DiscordUser.findOne({discordId: id}); если (найтиПользователь) { findUser.accessToken = accessToken; findUser.refreshToken =refreshToken; дождитесь findUser.save(); возврат выполнен (нуль, findUser); } еще { const newUser = ждут DiscordUser.create({ дискордид: идентификатор, имя пользователя, электронная почта, токен доступа, обновитьТокен, передний пользователь: нуль }); возвращение выполнено (нуль, newUser); } } поймать (ошибиться) { console.error(ошибка); возврат выполнен (ошибка, ноль); } } ) ); // Регистрация идентификатора пользователя, соответствующего интерфейсному пользователю, в таблице DiscordUser /*console.log('d',DiscordUser._id); FrontUser.findOne({discordUserId : DiscordUser._id }) .then((frontUser) => { console.log('FrontUser:', frontUser); const get_id = frontUser._id; // Добавление информации о пользователе DiscordUser.frontUserId = get_id; DiscordUser.save(); });*/ модуль.экспорт = паспорт; И за достройку дорог
require('dotenv').config(); const express = require('express'); const паспорт = require('паспорт'); 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) => { рез.статус(200) }); router.get('/discord/redirect', паспорт.аутентификация('discord',{ errorRedirect:'http://localhost:3000/'}), (req, res) => { res.redirect('http://localhost:3000/'); }); // Определение маршрута аутентификации Twitter router.get('/twitter', Passport.authenticate('twitter'),(req, res) => { рез.статус(200); }); // Обратный вызов после аутентификации Twitter router.get('/twitter/redirect', Passport.authenticate('twitter', { errorRedirect:'http://localhost:3000/'}), (req, res) => { res.redirect('http://localhost:3000/'); }); модуль.экспорт = маршрутизатор; Я искренне ценю любую вашу помощь, поскольку я сейчас застрял в этом вопросе. Заранее благодарим вас за помощь.
В настоящее время я столкнулся с серьезной проблемой. Мой интерфейс создан на основе Next.js, а серверная часть API — на платформе Express. Я реализую систему двойной аутентификации, в которой пользователям необходимо подключаться как к Discord, так и к Twitter.
В идеале, когда оба соединения успешно установлены, у меня должно быть два отдельных файла cookie для каждой службы. Однако проблема, с которой я столкнулся, заключается в том, что значение файла cookie Twitter каким-то образом сохраняется в значении файла cookie Discord. Я очень озадачен, почему это происходит.
МОЙ КОД
разногласия в промежуточном программном обеспечении
require('dotenv').config(); const паспорт = require('паспорт'); const DiscordStrategy = require('passport-discord').Strategy; const {Профиль} = require('passport-discord'); //const { DiscordUser, FrontUser } = require('../models'); const DiscordUser = require('../models/DiscordUser'); const FrontUser = require('../models/FrontUser'); константный токен = процесс.env.AUTH0_CLIENT_SECRET; константный клиент = процесс.env.AUTH0_CLIENT_ID; паспорт.serializeUser((пользователь, готово) => { сделано (нуль, user.id); }); паспорт.deserializeUser(async (id, готово) => { пытаться { пусть пользователь = ждут DiscordUser.findById(id); if (!user.frontuser || user.frontuser.length === 0) { const frontUser = await FrontUser.findOne({discordUserId: id}); если (frontUser) { user.frontuser = [frontUser._id]; дождитесь пользователя.save(); } } пользователь = ждут DiscordUser.findById(id).populate('frontuser'); //console.log('1',user.frontuser._id, user.frontuser[0].publicKey); // Добавление информации о пользователе если (user.frontuser !== ноль) { если (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('Пользователь:', пользователь); // Добавление информации о пользователе сделано (ноль, пользователь); } поймать (ошибиться) { сделано (ошибка, ноль); } }); паспорт.использовать( новая DiscordStrategy( { идентификатор клиента: клиент, clientSecret: токен, URL-адрес обратного вызова: 'http://localhost:3001/api/v1/auth/discord/redirect', область действия: ['идентифицировать', 'электронная почта'], }, асинхронный ( токен доступа, обновитьТокен, профиль, готово) => { пытаться { const {id, имя пользователя, дискриминатор, адрес электронной почты} = профиль; const findUser = await DiscordUser.findOne({discordId: id}); если (найтиПользователь) { findUser.accessToken = accessToken; findUser.refreshToken =refreshToken; дождитесь findUser.save(); возврат выполнен (нуль, findUser); } еще { const newUser = ждут DiscordUser.create({ дискордид: идентификатор, имя пользователя, электронная почта, токен доступа, обновитьТокен, передний пользователь: нуль }); возвращение выполнено (нуль, newUser); } } поймать (ошибиться) { console.error(ошибка); возврат выполнен (ошибка, ноль); } } ) ); // Регистрация идентификатора пользователя, соответствующего интерфейсному пользователю, в таблице DiscordUser /*console.log('d',DiscordUser._id); FrontUser.findOne({discordUserId : DiscordUser._id }) .then((frontUser) => { console.log('FrontUser:', frontUser); const get_id = frontUser._id; // Добавление информации о пользователе DiscordUser.frontUserId = get_id; DiscordUser.save(); });*/ модуль.экспорт = паспорт; Промежуточное программное обеспечение Twitter
const Passport = require('passport'); const TwitterStrategy = require('passport-twitter').Strategy; const TwitterUser = require('../models/TwitterUser'); // Настройка аутентификации Twitter паспорт.use(новый TwitterStrategy({ ConsumerKey:process.env.CONSUMER_TWITTER_KEY, потребительскийсекрет: процесс.env.CONSUMER_TWITTER_KEY_SECRET, URL-адрес обратного вызова:process.env.CALLBACK_TWITTER, }, асинхронный( токен, токенСекрет, профиль, готово) => { //console.log(профиль); пытаться { const {id, _json} = профиль; константное имя = _json.name; const screen_name = _json.screen_name; const Followers_count = _json.followers_count; const findUser = await TwitterUser.findOne({twitterId: id}); если (найтиПользователя) { findUser.token = токен; findUser.tokenSecret = tokenSecret; дождитесь findUser.save(); возврат выполнен (нуль, findUser); } еще { //console.log('pofileTest',id,name, screen_name,followers_count) const newUser = await TwitterUser.create({ твиттерИд: идентификатор, Имя пользователя: имя, имя_экрана: имя_экрана, последователиCount: последователи_count, жетон: жетон, токенсекрет: токенсекрет }); возвращение выполнено (нуль, newUser); } } поймать (ошибка) { console.error(ошибка); возврат выполнен (ошибка, ноль); } })); // Сериализация пользователя в сеансе паспорт.serializeUser((пользователь, готово) => { сделано (нуль, user.id); }); // Десериализация пользователя в части сеанса паспорт.deserializeUser(async(id, Done) => { // Вы можете использовать идентификатор пользователя для получения информации о пользователе из базы данных // готово (нуль, пользователь); пытаться { пусть пользователь = ждут TwitterUser.findById(id); сделано (нуль, пользователь) } поймать (ошибка) { сделано (ошибка, ноль); } }); модуль.экспорт = паспорт; appDiscord
// appDiscord.js const session = require('экспресс-сессия'); const MongoStore = require('connect-mongo'); require('./middleware/discord'); const discordSession = сессия({ секрет: процесс.env.SESSION_SECRET_DISCORD, пересохранить: ложь, saveUninitialized: ложь, печенье: { МаксВозраст: 6000*60*24*7, }, магазин: MongoStore.create({ mongoUrl: 'mongodb+srv://cedaffair:aNE51Cj9k25nPaFI@cluster0.uy7w7ps.mongodb.net/test', Имя коллекции: 'sessionDiscord' }), имя: 'discordConnect', }); // ... другие конфигурации, специфичные для Discord модуль.экспорт = discordSession; appTwitter
// appTwitter.js const session = require('экспресс-сессия'); const MongoStore = require('connect-mongo'); require('./middleware/twitter'); const twitterSession = сеанс({ секрет: процесс.env.SESSION_SECRET_TWITTER, пересохранить: ложь, saveUninitialized: ложь, печенье: { МаксВозраст: 6000*60*24*7, }, магазин: MongoStore.create({ mongoUrl: 'mongodb+srv://cedaffair:aNE51Cj9k25nPaFI@cluster0.uy7w7ps.mongodb.net/test', Имя коллекции: 'sessionTwitter' }), имя: «twitterConnect», }) // ... другие специфические конфигурации в Twitter модуль.экспорт = twitterSession; Файл appDiscord и appTwitter оплачиваются в app.js
мой файл app.js
require('dotenv').config(); const паспорт = require('паспорт'); const DiscordStrategy = require('passport-discord').Strategy; const {Профиль} = require('passport-discord'); //const { DiscordUser, FrontUser } = require('../models'); const DiscordUser = require('../models/DiscordUser'); const FrontUser = require('../models/FrontUser'); константный токен = процесс.env.AUTH0_CLIENT_SECRET; константный клиент = процесс.env.AUTH0_CLIENT_ID; паспорт.serializeUser((пользователь, готово) => { сделано (нуль, user.id); }); паспорт.deserializeUser(async (id, готово) => { пытаться { пусть пользователь = ждут DiscordUser.findById(id); if (!user.frontuser || user.frontuser.length === 0) { const frontUser = await FrontUser.findOne({discordUserId: id}); если (frontUser) { user.frontuser = [frontUser._id]; дождитесь пользователя.save(); } } пользователь = ждут DiscordUser.findById(id).populate('frontuser'); //console.log('1',user.frontuser._id, user.frontuser[0].publicKey); // Добавление информации о пользователе если (user.frontuser !== ноль) { если (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('Пользователь:', пользователь); // Добавление информации о пользователе сделано (ноль, пользователь); } поймать (ошибиться) { сделано (ошибка, ноль); } }); паспорт.использовать( новая DiscordStrategy( { идентификатор клиента: клиент, clientSecret: токен, URL-адрес обратного вызова: 'http://localhost:3001/api/v1/auth/discord/redirect', область действия: ['идентифицировать', 'электронная почта'], }, асинхронный ( токен доступа, обновитьТокен, профиль, готово) => { пытаться { const {id, имя пользователя, дискриминатор, адрес электронной почты} = профиль; const findUser = await DiscordUser.findOne({discordId: id}); если (найтиПользователь) { findUser.accessToken = accessToken; findUser.refreshToken =refreshToken; дождитесь findUser.save(); возврат выполнен (нуль, findUser); } еще { const newUser = ждут DiscordUser.create({ дискордид: идентификатор, имя пользователя, электронная почта, токен доступа, обновитьТокен, передний пользователь: нуль }); возвращение выполнено (нуль, newUser); } } поймать (ошибиться) { console.error(ошибка); возврат выполнен (ошибка, ноль); } } ) ); // Регистрация идентификатора пользователя, соответствующего интерфейсному пользователю, в таблице DiscordUser /*console.log('d',DiscordUser._id); FrontUser.findOne({discordUserId : DiscordUser._id }) .then((frontUser) => { console.log('FrontUser:', frontUser); const get_id = frontUser._id; // Добавление информации о пользователе DiscordUser.frontUserId = get_id; DiscordUser.save(); });*/ модуль.экспорт = паспорт; И за достройку дорог
require('dotenv').config(); const express = require('express'); const паспорт = require('паспорт'); 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) => { рез.статус(200) }); router.get('/discord/redirect', паспорт.аутентификация('discord',{ errorRedirect:'http://localhost:3000/'}), (req, res) => { res.redirect('http://localhost:3000/'); }); // Определение маршрута аутентификации Twitter router.get('/twitter', Passport.authenticate('twitter'),(req, res) => { рез.статус(200); }); // Обратный вызов после аутентификации Twitter router.get('/twitter/redirect', Passport.authenticate('twitter', { errorRedirect:'http://localhost:3000/'}), (req, res) => { res.redirect('http://localhost:3000/'); }); модуль.экспорт = маршрутизатор; Я искренне ценю любую вашу помощь, поскольку я сейчас застрял в этом вопросе. Заранее благодарим вас за помощь.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Получение количества подписчиков пользователя Twitter с помощью Twitter API бесплатно
Anonymous » » в форуме Python - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-
-
-
«Настойчивое преследование: подключение моего Discord.py Discord Bot к сети на Python»
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-