У меня были плохие дни, пытаясь выяснить, как использовать refresh_token
, предоставляемый стратегией passport-discord
.
Я использую passport-oauth2-refresh
для получения новых accessToken
и refreshToken
, но на данный момент я действительно не знаю, как «обновить sh» объект пользователя, отправленный мне стратегией «паспорт-разногласие»
Это вся стратегия logi c
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser(async (id, done) => {
const user = await discordUser.findById(id);
if (user) done(null, user);
});
const strat = new discordStrategy(
{
clientID: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
callbackURL: process.env.CLIENT_REDIRECT,
scope: ["identify", "guilds"],
},
async (accessToken, refreshToken, profile, done) => {
try {
let user = await discordUser.findOne({ discordId: profile.id });
if (user) {
discordUser.findOneAndUpdate(
{ discordId: profile.id },
{ guilds: profile.guilds, rtoken: refreshToken, atoken: accessToken },
async (err) => {
if (err) throw err;
let newUser = await discordUser.findOne({ discordId: profile.id });
done(null, newUser);
}
);
} else {
const newUser = await discordUser.create({
discordId: profile.id,
username: profile.username,
discriminator: profile.discriminator,
avatar: profile.avatar,
guilds: profile.guilds,
rtoken: refreshToken,
atoken: accessToken,
});
const savedUser = await newUser.save();
done(null, savedUser);
}
} catch (err) {
console.log(err);
done(err, null);
}
}
);
passport.use("discord", strat);
refresh.use("discord", strat);
И это маршрут Express, который обрабатывает страницу входа.
function isAuthorized(req, res, next) {
if (req.user) {
res.redirect("/");
} else {
next();
}
}
router.get("/", passport.authenticate("discord"));
router.get(
"/redirect",
isAuthorized,
passport.authenticate("discord", {
failureRedirect: "/",
successRedirect: "/close",
})
);
Я кодирую веб-панель, которая должна отображать все гильдии в том, что у пользователя есть особые разрешения ... Мне нужно обновлять объект пользователя каждый раз, когда пользователь переходит к маршруту /guilds
, потому что он мог создать новую гильдию или получить повышение и т.д. c ...