Reputation: 63
Here is the code for JWT:
const express = require("express");
const jwt = require("jsonwebtoken");
const app = express();
app.use(express.json());
const user = [
{
name: "Rohan",
id: 1,
},
{
name: "Sophie",
id: 2,
},
{
name: "Charlie",
id: 3,
},
];
app.get("/", (req, res) => {
res.send("Welcome to Homepage");
});
app.get("/id", verifyToken, (req, res) => {
res.json(user.filter((id) => user.name === req.user.name));
});
function verifyToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(" ")[1];
if (token == null) return res.sendStatus(401);
jwt.verify(token, "secretKey", (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
app.post("/login", (req, res) => {
const username = req.body.username;
const user = { name: username };
jwt.sign(user, "secretKey", (err, token) => {
res.json({ token: token });
});
});
app.listen(4000, () => {
console.log("Server is listening on port: 4000");
});
The req.headers['authorization'] is returning undefined when console.log(The req.headers['authorization'])
This code for JWT always return Status 401 (Unauthorized) when the request is sent in the format Authorization: Bearer "token" ,
Please help !!
Upvotes: 6
Views: 19967
Reputation: 1
Use this to split.
const token = req.headers && req.headers["authorization"].split(' ')[1]
I am attaching a snippet for reference
const jwt = require('jsonwebtoken');
const User = require('../models/user');
exports.isAuth = async (req, res, next) => {
if(req.headers && req.headers["authorization"]){
const token = req.headers && req.headers["authorization"].split(' ')[1]
const decode = jwt.verify(token, process.env.JWT_SECRET);
const user = await User.findById(decode.userId);
if(!user){
return res.json({
success: false,
message: 'unauthorized access!'
})
}
req.user = user;
next();
}else{
res.json({success: false, message: 'unauthorized access!'})
}
};
Upvotes: -1
Reputation: 1
I think the split syntax is incorrect. This code I have written below will work:
const authHeader = req.headers["authorization"];
console.log(authHeader)
const [bearer, token] = authHeader.split(' ');
if (!token) {
return res
.status(401)
.json({ error: 404, message: "Access denied. No token provided." });
}
Upvotes: -1
Reputation: 838
Do you use the Postman for test?
add 'authorization' key in headers section on the postman, like picture:
and not need 'authHeader.split(" ")1;' , please change your code like this:
const token = req.headers["authorization"];
// const token = authHeader && authHeader.split(" ")[1];
console.log(token)
Upvotes: 7