使用 Auth0 注销时 Heroku "returnTo" 查询字符串参数错误
Heroku "returnTo" querystring parameter error on logout using Auth0
我正在使用 Heroku 并且大部分部署成功。注销让我真的很难过。
根据文档,我应该传递 url 之类的
https://xxxxauth0tennantxxxx/v2/logout
或
https://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".
错误
我已经尝试添加允许注销的每个变体url我可以尝试但没有运气http://localhost:8000,http://*.herokuapp.com,https://*.auth0.com/v2/logout,https://*.auth0.com/,https://xxxxxxx.auth0.com
我什至尝试设置app.set('trust proxy', 1);
正如一些文档建议的Heroku。
拜托,我如何解释 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);
});
}
});
休息一下对疲倦的眼睛有什么不同,有这么多(优秀的)文档,只是非常令人困惑和不知所措,但我想我现在明白了。现在检查一切是否安全且可以安全使用。
我正在使用 Heroku 并且大部分部署成功。注销让我真的很难过。 根据文档,我应该传递 url 之类的
https://xxxxauth0tennantxxxx/v2/logout
或
https://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".
我已经尝试添加允许注销的每个变体url我可以尝试但没有运气http://localhost:8000,http://*.herokuapp.com,https://*.auth0.com/v2/logout,https://*.auth0.com/,https://xxxxxxx.auth0.com
我什至尝试设置app.set('trust proxy', 1);
正如一些文档建议的Heroku。
拜托,我如何解释 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);
});
}
});
休息一下对疲倦的眼睛有什么不同,有这么多(优秀的)文档,只是非常令人困惑和不知所措,但我想我现在明白了。现在检查一切是否安全且可以安全使用。