
I'm building my first SPA project with Vue.
I decided to go with NodeJS for the back-end, however, I'm having a headache building the login function with the JsonWebToken.
I had wrote some codes to see how JWT works and when I tried to see how JWT gets verified, server gave me an error.
JsonWebTokenError: jwt must be provided at Object.module.exports [as verify] (c:\dir\node_modules\jsonwebtoken\verify.js:39:17) at c:\projects\practice\demo\back\server.js:34:17
Below is the code for my server.js
This is the code for importing the stuff.
const express = require('express'); const jwt = require('jsonwebtoken'); const bodyParser = require('body-parser'); const api = express(); api.use(bodyParser.json()); api.use(bodyParser.urlencoded({ extended: true }));
This is for the API for issuing JWT.
api.post('/secure', function (req, res) { const token = jwt.sign({ user: {id:1, name:'ME!', role: 'average'} }, 'dsfklgj'); console.log(token); res.json({jwt: token}); });
This is the API for checking JWT.
api.post('/check/post', function (req, res) { const token = req.body.jwt; const x = jwt.verify(token, 'dsfklgj', function (err, decoded) { if (err) throw err; console.log(decoded); }); if (x != true) { res.json({ auth: false }); }else { res.json({ auth: true }); } });
23 Answers
jwt must be provided
This error happens when the coming token is null or empty.
4Make sure that the Authorization
header has a value of Bearer <Access Token>
. Bearer < white space > < Access Token >
It may be you have not defined jwt
in specific file or it is null or empty. Therefore you are getting an error. I just test your code and it works for me. It may be that you are not sending jwt
token into post request correctly.
const express = require('express'); const jwt = require('jsonwebtoken'); const bodyParser = require('body-parser'); const http = require('http'); const api = express(); api.use(bodyParser.json()); api.use(bodyParser.urlencoded({ extended: true })); api.post('/secure', function(req, res) { const token = jwt.sign({ user: { id: 1, name: 'ME!', role: 'average' } }, 'dsfklgj'); console.log(token); res.json({ jwt: token }); }); api.post('/check/post', function(req, res) { const token = req.body.jwt; console.log('token: ' + token); const x = jwt.verify(token, 'dsfklgj', function(err, decoded) { if (err) throw err; console.log(decoded); }); console.log(x); if (x != true) { res.json({ auth: false }); } else { res.json({ auth: true }); } }); api.set('port', 3000); var server = http.createServer(api); server.listen(api.get('port'), function() { console.log("Express server listening on port " + api.get('port')); });
BTW there is no way to test it like like this const x = jwt.verify(token, 'dsfklgj', function (err, decoded) {
. Either write it in Sync
way or check condition in async
callback function. In your case, x
will be undefined
and no guarantee when it will run.
ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJoa3FsZ2uDc4GOoZivoZ6cerW%2Bzq6ZpZ1drLa1tIyjqqimp5qvtbvKnqVmoqOku7ixwa2mpJ2eYrKzvs6rZKOvpGK6tr%2FTZpmeZaCnvLe1w56b