首页 > 解决方案 > Discord.js Oauth2 与 passport.js

问题描述

我有一些糟糕的日子试图弄清楚如何使用该策略refresh_token提供的passport-discord

passport-oauth2-refresh用来获取一个新的accessTokenand 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,因为他本可以创建一个新的公会,或升职等...

标签: javascriptnode.jsexpressoauth-2.0passport.js

解决方案


推荐阅读