javascript - Discord.js Oauth2 与 passport.js
问题描述
我有一些糟糕的日子试图弄清楚如何使用该策略refresh_token
提供的passport-discord
。
我passport-oauth2-refresh
用来获取一个新的accessToken
and refreshToken
,但此时我真的不知道如何“刷新”通过 passport-discord 策略发送给我的用户对象
这是整个策略逻辑
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",
})
);
我正在编写一个 web 仪表板,它必须在用户拥有一些特殊权限的情况下显示所有公会......每次用户导航到路线时,我都需要更新用户对象/guilds
,因为他本可以创建一个新的公会,或升职等...
解决方案
推荐阅读
- ios - 如何在 UIKit 上的 Xcode 11/iOS13 中使用协调器模式?
- node.js - 我想在node express api中回复会员信息
- java - Kafka Streams 任务分配
- android - 如何在改造多部分请求中发送对象数组
- javascript - 在 express/react SSR 应用程序中使用 materialize-css
- .net - HttpContext.Current 的生命周期是多少?
- elasticsearch - 除了使用 Elasticsearch 恢复 API 之外,还有其他方法可以恢复 Elasticsearch 快照吗?
- api - 在空手道 API 中使用条件逻辑
- mongodb - 检查今天的日期是否大于聚合 mongodb 中的 if 条件
- api - 如何使用 WSO2 API MicroGateway 组合多个微服务