0

i am using jsonwebtoken for generating JSON webtokens for authenticating users, i am done with generating tokens but whenever i send token to the server it doesnot get verified it always end with TypeError: jwt.verify is not a function someone please help on this how to verify token,

var express = require('express');
var app = express();
 var bodyParser = require('body-parser');
var morgan = require('morgan');
var mongoose = require('mongoose');
var moment = require('moment');

 var jwt = require('jwt-simple'); // used to create, sign, and verify tokens
var config = require('./config'); // get our config file
var User = require('./models/users'); // get our mongoose model


 var port = process.env.PORT || 8080; // used to create, sign, and verify    tokens
 mongoose.connect(config.database); // connect to database
app.set('superSecret', config.secret); // secret variable

 // use body parser so we can get info from POST and/or URL parameters
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// use morgan to log requests to the console
app.use(morgan('dev'));


 var router = express.Router();
router.post('/authenticate', function(req, res, next) {
console.log(req.body.name);
User.findOne({ name: req.body.name }, function(err, user) {
    if (err) {
        throw err;
    }
    if (!user) {
        res.json({ success: false, message: 'Authentication failed. User not found.' });
    } else if (user) {
        if (user.password != req.body.password) {
            res.json({ success: false, message: 'Authentication failed. Wrong password.' });
        } else {
             // now create token here
            var token = jwt.sign(user,app.get('superSecret'),{
                expiresIn:1440 
            });

            res.json({
                success: true,
                message: 'Enjoy your token!',
                token: token
            });
        }
    }
})
})
//decoding jwt
  router.use(function(req, res, next) {

   // check header or url parameters or post parameters for token
  var token = req.body.token || req.query.token || req.headers['x-access- token'];

  // decode token
   if (token) {

   // verifies secret and checks exp
   var decode =  jwt.verify(token, "jsonWebTokens", function(err, decoded) {      
      if (err) {
         return res.json({ success: false, message: 'Failed to authenticate token.' });    
      } else {
        // if everything is good, save to request for use in other routes
       req.decoded = decoded;    
      next();
     }
    });

  } else {

    // if there is no token
  // return an error
  return res.status(403).send({ 
    success: false, 
    message: 'No token provided.' 
  });

  }
   });

 router.get('/', function(req, res, next) {
    res.send("hello and welcome to express routing");
 })

router.get('/users', function(req, res, next) {
    User.find({}, function(err, users) {
        res.json(users);

   // decode token

    })
     })

 app.use('/api', router);
 // basic route
 app.get('/', function(req, res) {
     res.send('Hello! The API is at http://localhost:' + port + '/api');
     });

 //for users
 app.get('/setup', function(req, res) {

    // create a sample user
    var nick = new User({
    name: 'Nick Cerminara',
    password: 'password',
    admin: true
    });

    // save the sample user
    nick.save(function(err) {
      if (err) throw err;

      console.log('User saved successfully');
      res.json({ success: true });
  });
 });

app.listen(port);
console.log('Magic happens at http://localhost:' + port);

i followed this tutorial https://scotch.io/tutorials/authenticate-a-node-js-api-with-json-web-tokens#authenticating-and-creating-a-token

1
  • Did you run npm i to install dependencies? Commented Jul 17, 2016 at 12:23

1 Answer 1

2

var jwt = require('jwt-simple');

You should be using the npm module jsonwebtoken instead. The jwt-simple module is for encoding and decoding jsonwebtoken only.

See: https://www.npmjs.com/package/jwt-simple

It does not provide you with those sign, create and verify api.

While module jsonwebtoken does provide those APIs.

JsonWebToken:
https://www.npmjs.com/package/jsonwebtoken

To fix this,

  1. Install jsonwebtoken module, if you haven't got it. npm install jsonwebtoken
  2. Modify variable jwt to import jsonwebtoken instead. var jwt = require('jsonwebtoken');

Let me know if this works. Glad to look further if it doesn't.

Sign up to request clarification or add additional context in comments.

3 Comments

@kisor I realized you have unaccepted the solution just checking to see if is there anything wrong with the proposed answer. Or anything I can add to help you further.
I totally accept your ans. And I am thankful you you too.
This works but isn't there any package that is a more lightweight package? According to Import Cost it's 339.4KB (108.5kb after gzipped)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.