next() 中间件不适用于令牌身份验证
next() middleware not working with token authentication
我正在使用电子邮件身份验证进行帐户注册,我在 URL 上发送令牌,然后我使用 useParams 从 URL 获取令牌并将其传递到后端以最后验证用户的帐户。
问题是在后端的身份验证中间件上,next() 回调没有继续处理。
中间件 resolves/decodes 令牌 成功 (因为它显示了存储在其中的用户 ID),当调用 next() 时,一切都停止了,不是吗?不要给出任何错误,什么都没有。当我发出 GET 请求时会发生这种情况,如果我发出 POST 请求它 returns 令牌无效,这是不正确的。
前端请求:
const Confirmation = () => {
const [popMessage, setPopMessage] = useState('');
let params = useParams("/confirm/:token");
const {token} = params;
const confirmAcc = async () =>{
try {
const config = {
headers:{
'x-auth-token': token,
}
}
await axios.get('/api/auth/confirm/', config)
.catch(err=>{
console.error(err.response);
})
setPopMessage('Your account has been confirmed');
// setTimeout(() => { window.location.href = '/login';}, 3500);
} catch (err) {
console.log(err.response.data);
return;
}
}
后端路由:
router.get('/confirm/', auth, async (req, res) => {
console.log('Im here!!')
try {
console.log('Im here too!!')
const user = await User.findById(req.user.id).select('-password');
console.log('user', user)
await user.update({ confirmed: true });
sendEmail(user.email, user.name, "welcome");
} catch (err) {
res.status(401).send('your email token is invalid');
return;
}
});
中间件'auth':
module.exports = function(req, res, next) {
const token = req.header('x-auth-token');
if (!token) {
return res.status(401).send('No token, authorization denied ');
}
try {
const decoded = jwt.verify(token, config.get('jwtSecret'));
console.log('decoded:', decoded)
req.user = decoded.user;
next();
} catch(err) {
res.status(401).send('Token is not valid');
}
}
最奇怪的事情:它只发生在这个路由器上,应用程序的其余部分使用完全相同的代码工作正常。如果有人能分享任何想法,我将不胜感激。
提前致谢!
问题是请求的类型:我更改为 PUT 请求并在请求上发送了一个空主体。这修复了它,这里是代码:
const Confirmation = () => {
const [popMessage, setPopMessage] = useState('');
let params = useParams("/confirm/:token");
const {token} = params;
const confirmAcc = async () =>{
try {
const config = {
headers:{
'x-auth-token': token,
}
}
// here, empty body and PUT req.
const body = null
axios.put('/api/auth/confirm/',body, config)
.catch(err=>{
console.error(err.response);
});
setPopMessage('Your account has been confirmed');
setTimeout(() => { window.location.href = '/login';}, 3500);
} catch (err) {
console.log(err.response.data);
return;
}
};
我正在使用电子邮件身份验证进行帐户注册,我在 URL 上发送令牌,然后我使用 useParams 从 URL 获取令牌并将其传递到后端以最后验证用户的帐户。
问题是在后端的身份验证中间件上,next() 回调没有继续处理。
中间件 resolves/decodes 令牌 成功 (因为它显示了存储在其中的用户 ID),当调用 next() 时,一切都停止了,不是吗?不要给出任何错误,什么都没有。当我发出 GET 请求时会发生这种情况,如果我发出 POST 请求它 returns 令牌无效,这是不正确的。
前端请求:
const Confirmation = () => {
const [popMessage, setPopMessage] = useState('');
let params = useParams("/confirm/:token");
const {token} = params;
const confirmAcc = async () =>{
try {
const config = {
headers:{
'x-auth-token': token,
}
}
await axios.get('/api/auth/confirm/', config)
.catch(err=>{
console.error(err.response);
})
setPopMessage('Your account has been confirmed');
// setTimeout(() => { window.location.href = '/login';}, 3500);
} catch (err) {
console.log(err.response.data);
return;
}
}
后端路由:
router.get('/confirm/', auth, async (req, res) => {
console.log('Im here!!')
try {
console.log('Im here too!!')
const user = await User.findById(req.user.id).select('-password');
console.log('user', user)
await user.update({ confirmed: true });
sendEmail(user.email, user.name, "welcome");
} catch (err) {
res.status(401).send('your email token is invalid');
return;
}
});
中间件'auth':
module.exports = function(req, res, next) {
const token = req.header('x-auth-token');
if (!token) {
return res.status(401).send('No token, authorization denied ');
}
try {
const decoded = jwt.verify(token, config.get('jwtSecret'));
console.log('decoded:', decoded)
req.user = decoded.user;
next();
} catch(err) {
res.status(401).send('Token is not valid');
}
}
最奇怪的事情:它只发生在这个路由器上,应用程序的其余部分使用完全相同的代码工作正常。如果有人能分享任何想法,我将不胜感激。
提前致谢!
问题是请求的类型:我更改为 PUT 请求并在请求上发送了一个空主体。这修复了它,这里是代码:
const Confirmation = () => {
const [popMessage, setPopMessage] = useState('');
let params = useParams("/confirm/:token");
const {token} = params;
const confirmAcc = async () =>{
try {
const config = {
headers:{
'x-auth-token': token,
}
}
// here, empty body and PUT req.
const body = null
axios.put('/api/auth/confirm/',body, config)
.catch(err=>{
console.error(err.response);
});
setPopMessage('Your account has been confirmed');
setTimeout(() => { window.location.href = '/login';}, 3500);
} catch (err) {
console.log(err.response.data);
return;
}
};