javascript - JWT decode returns null -


i'm new node.js, reading node.js essentials fabian cook. when trying code in authentication jwt, got null jwt.decode( token ), token can parsed debugger on jwt.io. what's wrong code?

var passport = require( 'passport' ); var localstrategy = require( 'passport-local' ).strategy; var express = require( 'express' ); var bodyparser = require( 'body-parser' ); var jwt = require( 'jsonwebtoken' ); var crypto = require ( 'crypto' );  var users = {   zack: {     username: 'zack',     password: '1234',     id: 1,   },   node: {     username: 'node',     password: '5678',     id: 2,   }, }  var localstrategy = new localstrategy({       usernamefield: 'username',       passwordfield: 'password',     },     function(username, password, done) {       user = users[ username ];        if ( user == null ) {         return done( null, false, { message: 'invalid user' } );       };        if ( user.password !== password ) {         return done( null, false, { message: 'invalid password' } );       };        done( null, user );     }   )  passport.use( 'local', localstrategy );  var app = express(); app.use( bodyparser.urlencoded( { extended: false } ) ); app.use( bodyparser.json() ); app.use( passport.initialize() );  var generatetoken = function( req, res ) {   var payload = {     id: user.id,     username: user.username   }   var secret = user.secret || crypto.randombytes( 128 ).tostring( 'base64' );   var token = jwt.sign( payload, secret );   user.secret = secret;   return token; };  var generatetokenhandler = function ( req, res ) {   var user = req.user;   var token = generatetoken( user );   res.send( token ); };  app.post(   '/login',   passport.authenticate( 'local', { session: false } ),   generatetokenhandler );  var bearerstrategy = require( 'passport-http-bearer' ).strategy;  var verifytoken = function( token, done ) {   var payload = jwt.decode(token);   if ( payload == null ){     return done( null, false );   }   console.log(payload);   var user = users[ payload.username ];   if ( user == null ||        user.id !== payload.id ||        user.username !== payload.username ) {     return done( null, false );   }   jwt.verify( token, user.secret, function ( error, decoded ) {     if ( error || decoded == null ) {       return done( error, false );     }     return done( null, user );   }) } var bearerstrategy = new bearerstrategy( verifytoken )   passport.use( 'bearer', bearerstrategy );   app.get(   '/userinfo',   passport.authenticate( 'bearer', { session: false } ),   function ( req, res ) {     var user = request.user;     res.send( {       id: user.id,       username: user.username     });   } );  app.listen( 3000, function() {   console.log( 'listening on 3000' ); }); 

here token got code f.y.i.

eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.eyjpzci6mswidxnlcm5hbwuioij6ywnriiwiawf0ijoxndu5mdazmtyxfq.rhqox0icrvivncwwlnsu5kiznplqtkpveqfcuxtii90~ 

i believe issue when using jwt.decode while having secret key need pass in option decode call complete set true:

from jwt docs:

// decoded payload ignoring signature, no secretorprivatekey needed var decoded = jwt.decode(token);  // decoded payload , header var decoded = jwt.decode(token, {complete: true}); console.log(decoded.header); console.log(decoded.payload) 

https://github.com/auth0/node-jsonwebtoken

apparently might best use jwt.verify here:

warning: not verify whether signature valid. should  not use untrusted messages. want use jwt.verify instead. 

Comments