Discord. js Oauth2 с паспортом. js - PullRequest
0 голосов
/ 13 июля 2020

У меня были плохие дни, пытаясь выяснить, как использовать 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 ...

...