Discord OAuth 有时不完成

Discord OAuth does not complete only sometimes

import passportDiscord from "passport-discord";

passport.serializeUser(function(user, done) { done(null, user); });
passport.deserializeUser(function(user, done) { done(null, user); });
passport.use(new DiscordStrategy({
    clientID: OAuth.Discord.Client,
    clientSecret: OAuth.Discord.Secret,
    callbackURL: OAuth.Discord.Callback,
    scope: ['identify', 'email']
 },
 function(accessToken, refreshToken, profile, cb) {
    const avatarUrl = `https://cdn.discordapp.com/avatars/${profile.id}/${profile.avatar}.png`;
    User.findOrCreate({ userAuthName: 'Discord', userAuthId: profile.id, userName: profile.username, userEmail: profile.email, userEnum: '0001', userAvatar: avatarUrl  }, function(err, user) {
       process.nextTick(function() {
           return cb(err, user);
       });
    });
 }));

auth.get('/discord', passport.authenticate('discord'));
auth.get('/discord/callback', passport.authenticate('discord', {
    failureRedirect: '/'
}), function (req: any, res: any) {
    User.addLog(req.user.userUniqueId, 'logged_in', Host.getAddress(req));
    let token = User.createJWT(req.user);
    res.cookie('token', token, {maxAge: Core.JWT.expiryMax, domain: Core.cookieUrl})
    res.cookie('world', req.user.userWorld, { domain: Core.cookieUrl });
    res.end();
    return res.redirect(Core.webProtocol + "://" + Core.webUrl)
});

这是我的 Discord 策略,clientIDclientSecretcallbackURL 已经过双重检查并且有效。他们在 Google Chrome 上工作,但有些问题在 Firefox 上的成功率为 50%。节点不会 return 错误日志,除非用户刷新它会说 invalid code request 这是有道理的,因为如果您尝试再次使用它,代码请求将无效。

编辑:我尝试删除 process.nextTick(),但同样的问题仍然存在。我也尝试禁用 Cloudflare 并使用普通的 HTTP 端口,但同样的问题仍然存在。

编辑:我仍在努力尝试 npm uninstall passport passport-discord 并重新安装,但问题仍然存在。这包括一个众所周知的护照问题包裹。

在这个问题上苦苦挣扎了 11 天后,解决方案是

  1. 不要在 return res.redirect() 之前使用 res.end() 这现在听起来很明显,但我太无知了。

  2. 我们没有使用 res.redirect(),而是使用 301

    手动编写了 headers
    auth.get('/discord', passport.authenticate('discord'));
    auth.get('/discord/callback', passport.authenticate('discord', {
        failureRedirect: '/'
    }), function (req: any, res: any) {
        User.addLog(req.user.userUniqueId, 'logged_in', Host.getAddress(req));
        let token = User.createJWT(req.user);
        res.cookie('token', token, {maxAge: Core.JWT.expiryMax, domain: Core.cookieUrl})
        res.cookie('world', req.user.userWorld, { domain: Core.cookieUrl });
        res.writeHead(301, { Location: Core.webProtocol + '://' + Core.webUrl });
        res.end();
    });