2015-10-22 3 views
1

Я пытаюсь аутентифицировать мой nodejs api с помощью Json Web Token (с помощью этого article), но проблема в том, что токен не истекает.nodejs - проблема с истечением срока действия JSONWebToken

var express = require('express'); 
var app = express(); 
var mongoose = require('mongoose'); 
var bodyParser = require('body-parser'); 
var jwt = require('jsonwebtoken'); 




mongoose.connect('mongodb://localhost/gd'); 
var schema = mongoose.Schema; 

app.use(bodyParser.urlencoded({ extended: false })); 
app.use(bodyParser.json()); 

var router = express.Router(); 

app.use('/api', router); 

var userSchema = new schema({ 
    username: String, 
    password: String 
},{ 
    collection: 'users' 
}); 

var User = mongoose.model('User', userSchema); 



router.post('/authenticate', function(req, res) { 

    User.findOne({ 
    username: req.body.username 
    }, 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 { 

     var token = jwt.sign(user, "secret", { 
      expiresIn: 60 
     }); 

     res.json({ 
      success: true, 
      message: 'Enjoy your token!', 
      token: token 
     }); 
     } 

    } 

    }); 
}); 



router.use(function(req, res, next) { 

    var token = req.body.token || req.query.token || req.headers['x-access-token']; 

    if (token) { 

    jwt.verify(token, "secret", function(err, decoded) {  
     if (err) { 
     return res.json({ success: false, message: 'Failed to authenticate token.' });  
     } else { 
     req.decoded = decoded;  
     next(); 
     } 
    }); 

    } else { 

    return res.status(403).send({ 
     success: false, 
     message: 'No token provided.' 
    }); 

    } 
}); 

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

var server = app.listen(3001, function() { 
    var host = server.address().address; 
    var port = server.address().port; 

}); 
+0

Try {expiresInSeconds: 6} 'jwt.sign ({ключ: значение, ...}, 'SECRET', {expiresInSeconds: });' пытаются положить сгенерированный токен 'HTTP: // jwt.io/# debugger 'see if u get field like ' 'iat": 1445503054, "exp": 1445531854' –

ответ

2

Для того, чтобы знать, истечение токена, JWT добавляет exp атрибут для полезной нагрузки. Однако ваша полезная нагрузка, когда вы передаете ее jwt.sign, является объектом mongoose, который (тихо) не позволит вам добавить атрибут, который не определен в схеме.

Решение должно быть, чтобы преобразовать пользователю обычного объекта перед его передачей в качестве полезной нагрузки:

var token = jwt.sign(user.toObject(), "secret", { 
    expiresIn: 60 
}); 
+0

Я действительно это знал, но не смог найти функцию преобразования объекта мангуста в нормальный объект. спасибо за 'toObject()' и объяснение – xperator

0

ниже фрагмент кода работает для меня ..

вар токенов = jwt.encode ({ iss: 'user', expiresIn: 60 }, 'secretToken');

Смежные вопросы