function verifyJWTHelper(jwtString, secretOrPrivateKey, options, callback) {
  // freeze the time to ensure the clock remains stable across the async and sync calls
  const fakeClock = sinon.useFakeTimers({now: Date.now()});
  let error;
  let syncVerified;
  try {
    syncVerified = jwt.verify(jwtString, secretOrPrivateKey, options);
  }
  catch (err) {
    error = err;
  }
  jwt.verify(jwtString, secretOrPrivateKey, options, (err, asyncVerifiedToken) => {
    try {
      if (error) {
        expectEqualError(err, error);
        callback(err);
      }
      else {
        expect(syncVerified, 'Async/Sync token equality').to.deep.equal(asyncVerifiedToken);
        callback(null, syncVerified);
      }
    }
    finally {
      if (fakeClock) {
        fakeClock.restore();
      }
    }
  });
}
Verify a JWT, ensuring that the asynchronous and synchronous calls to `verify` have the same result
@param {string} jwtString The JWT as a string
@param {string} secretOrPrivateKey The shared secret or private key
@param {object} options Verify options
@param {function(err, token):void} callback