Heroku 在使用 Auth0 注销时"returnTo"查询字符串参数错误



我正在使用Heroku并且部署得非常成功。注销真的让我难倒了。 根据文档,我应该传递一个网址,例如,

https://xxxxauth0tennantxxxx/v2/logouthttps://YOUR_DOMAIN/v2/logout?returnTo=http%3A%2F%2Fwww.example.com

当我这样做时,我就没事了。但我使用的是 Auth0 文档中的以下代码,该代码构建了包含端口号的 url。

router.get('/logout', (req, res) => {
req.logOut();
let returnTo = req.protocol + '://' + req.hostname;
const port = req.connection.localPort;
if (port !== undefined && port !== 80 && port !== 443) {
returnTo += ':' + port;
}
const logoutURL = new url.URL(
util.format('https://%s/v2/logout', process.env.AUTH0_DOMAIN),
);
const searchString = querystring.stringify({
client_id: process.env.AUTH0_CLIENT_ID,
returnTo: returnTo,
});
logoutURL.search = searchString;
res.redirect(logoutURL);
});

但是,Heroku会自动分配一个端口,因此每次我尝试注销时都会遇到错误The "returnTo" querystring parameter "http://xxxxx.herokuapp.com:12345" is not defined as a valid URL in "Allowed Logout URLs".

我尝试添加我可以尝试的每个变体允许注销网址,但没有运气http://localhost:8000,http://*.herokuapp.com,https://*.auth0.com/v2/logout,https://*.auth0.com/,https://xxxxxxx.auth0.com我什至尝试按照一些文档为 Heroku 建议设置app.set('trust proxy', 1);

请问,我如何解释 heroku 在我的注销 url 中分配的动态端口?

编辑:我也尝试过端点的这种变体

我尝试将端点调用编辑为

router.get('/logout', (req, res) => {
let returnTo = req.protocol + '://' + req.hostname;
const port = req.connection.localPort;
if (port !== undefined && port !== 80 && port !== 443) {
returnTo = process.env.NODE_ENV === 'production' ? `${returnTo}/` : `${returnTo}:${port}/`;
}
req.logout();
if (req.session) {
req.session.destroy(function(err) {
if (err) {
console.log(err);
}
console.log('Destroyed the user session on Auth0 endpoint');
res.redirect(req.protocol + '://' + process.env.AUTH0_DOMAIN + '/v2/logout?client_id=' + process.env.AUTH0_CLIENT_ID + '&returnTo=' + returnTo +' ');
});
}
});

如错误消息所示,您需要将http://xxxxx.herokuapp.com:12345添加到应用程序设置中的允许注销 URL。将 XXXXX 替换为 heroku 应用程序名称,并包括端口号。

最后,我只是在构建 url 时删除了端口,瞧,注销并重定向到主页。

router.get('/logout', (req, res) => {
let returnTo = req.protocol + '://' + req.hostname;
const port = req.connection.localPort;
if (port !== undefined && port !== 80 && port !== 443) {
returnTo = process.env.NODE_ENV === 'production' ? `${returnTo}/` : `${returnTo}`;
}
req.logout();
if (req.session) {
req.session.destroy(function(err) {
if (err) {
console.log(err);
}
console.log('Destroyed the user session on Auth0 endpoint');
const logoutURL = new url.URL(
util.format('https://%s/v2/logout', process.env.AUTH0_DOMAIN),
);
const searchString = querystring.stringify({
client_id: process.env.AUTH0_CLIENT_ID,
returnTo: returnTo,
});
logoutURL.search = searchString;
res.redirect(logoutURL);
});
}
});

休息对疲惫的眼睛有什么不同,有这么多(优秀的(文档,它非常混乱和压倒性,但我想我现在明白了。现在检查所有内容是否安全且使用安全。

最新更新