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 策略,clientID
、clientSecret
和 callbackURL
已经过双重检查并且有效。他们在 Google Chrome 上工作,但有些问题在 Firefox 上的成功率为 50%。节点不会 return 错误日志,除非用户刷新它会说 invalid code request
这是有道理的,因为如果您尝试再次使用它,代码请求将无效。
编辑:我尝试删除 process.nextTick()
,但同样的问题仍然存在。我也尝试禁用 Cloudflare 并使用普通的 HTTP 端口,但同样的问题仍然存在。
编辑:我仍在努力尝试 npm uninstall passport passport-discord
并重新安装,但问题仍然存在。这包括一个众所周知的护照问题包裹。
在这个问题上苦苦挣扎了 11 天后,解决方案是
不要在 return res.redirect()
之前使用 res.end()
这现在听起来很明显,但我太无知了。
我们没有使用 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();
});
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 策略,clientID
、clientSecret
和 callbackURL
已经过双重检查并且有效。他们在 Google Chrome 上工作,但有些问题在 Firefox 上的成功率为 50%。节点不会 return 错误日志,除非用户刷新它会说 invalid code request
这是有道理的,因为如果您尝试再次使用它,代码请求将无效。
编辑:我尝试删除 process.nextTick()
,但同样的问题仍然存在。我也尝试禁用 Cloudflare 并使用普通的 HTTP 端口,但同样的问题仍然存在。
编辑:我仍在努力尝试 npm uninstall passport passport-discord
并重新安装,但问题仍然存在。这包括一个众所周知的护照问题包裹。
在这个问题上苦苦挣扎了 11 天后,解决方案是
不要在
return res.redirect()
之前使用res.end()
这现在听起来很明显,但我太无知了。我们没有使用
手动编写了 headersres.redirect()
,而是使用301
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();
});