1
I’d like your help.
I have an API with Nodejs that performs user authentication (POST method), generating a Token (jwt) and returning the same:
module.exports = {
async authenticate(req, res) {
const { email, password } = req.body;
const response = await Person.findOne({ email }).select('+password');
if (!response)
return res.send({ error: 'User not found.'});
if(!await bcrypt.compare(password, response.password))
return res.send({ error: 'Invalid password.'});
response.password = undefined;
const token = jwt.sign({ id: response.id }, authConfig.secret, {
expiresIn: 86400,
});
res.send({
token,
});
},
}
In my frontend (Reactjs), after the user click on the Login button, I have the following event:
handleSubimit = async e => {
e.preventDefault();
if (!this.canBeSubmitted()) { return; }
if (this.state.email === '')
{
this.setState({
erros: { email: "The 'Email' field is required." }
});
console.log(this.state.erros.email);
return;
};
if (this.state.password === '')
{
this.setState({
erros: { password: "The 'Password' field is required." }
});
console.log(this.state.erros.password);
return;
};
const response = await api.post('/authenticate', {
email: this.state.email,
password: this.state.password,
});
if (response.data.error)
{
//do something here later
return;
}
const token = response.data.token;
api.defaults.headers.common['authorization'] = token;
this.props.history.push('/main')
};
In this part of the code, I am sent the user data to the API to do the validations and return the Token, then I save the Token in the "headers" and redirect to the page "Main".
It turns out that on this page, I make some requests in the API, and for these requests, there is a "Middlewares" and it is not getting the value of the Token that was saved in the "headers".
module.exports = (req, res, next) => {
const authHeader = req.headers.authorization;
if(!authHeader)
return res.status(401).send({ error: 'No token provided.' });
const parts = authHeader.split(' ');
if (!parts.length === 2)
return res.status(401).send({ error: 'Token error.' });
const [ scheme, token ] = parts;
if (!/^Bearer$/i.test(scheme))
return res.status(401).send({ error: 'Token malformatted.' });
jwt.verify(token, authConfig.secret, (err, decoded) => {
if (err) return res.status(401).send({ error: 'Token invalid.' });
req.userId = decoded.id;
return next();
})
}
Someone can help?
Thanks in advance.