我有一个明确的graphql端点,可以通过POST在${host}/api/graphql
到达。
在那条路由上,我具有身份验证中间件,并且如果用户未登录,则希望重定向到登录页面。
看起来像这样。
const authCheck = (req, res, next) => {
const referringUrl = req.get('referer');
try {
const token = req.cookies.Auth;
jwt.verify(token, process.env.AUTH_PRIVATE_KEY);
next();
} catch(err) {
res.redirect(302, `/login?redirect=${referringUrl}`);
}
}
起初,我将其作为响应状态代码307,并且在GET请求中可以正常工作。浏览器按预期将页面更改为referringUrl
。
但是对于Post请求,使用状态307导致浏览器重定向使用post方法。很好,所以我切换到302。现在它发送了一个get请求,但实际上并没有更改浏览器中的URL。
如何从服务器端完成此功能?
谢谢。
答案 0 :(得分:1)
重定向的Post-Post代码通常为303
(请参见其他),这应该避免重用您在307
中使用的POST方法。
奇怪的是303与302几乎是同一件事,并且接受这种重定向的浏览器应该跟随它并更改浏览器位置。因此,您当前的代码应该已经可以使用。
您说过Now it sends a get request but doesn't actually change the url in the browser
,所以我想您可能正在谈论Ajax通话?如果通过XhmlHttpRequest进行POST,那么您的问题不仅在于服务器端。这是关于处理Ajax调用中的重定向。然后,您可以遵循几个路径。您可以在堆栈溢出时搜索“重定向”和“ ajax”并找到一些建议。例如,您可以构建自己的应用程序级别协议,而不在JSON响应中发送HTTP重定向,而是发送应用程序重定向,并让js客户端理解它并更改位置,或进行其他操作。这是一个讨论很多的话题。
在安全性/鲁棒性方面,您可能需要做一些调整,例如在redirect()调用中使用的位置使用encodeURI
并检查referer
是否来自您真正处理过的域(或仅在登录页面的redirect
参数上强制执行亲戚网址)。
答案 1 :(得分:1)
就像@regilero所说的,客户端方面的问题。您的GraphQl服务器无法在浏览器中更改url,因为js代码而不是浏览器发出请求。
您可以捕获30 *错误状态,并在客户端代码上手动进行重定向。
如果您将Apollo Client用于graphQl,则可以遵循本指南https://www.apollographql.com/docs/react/features/error-handling/#network-errors