#node.js #express #jwt
#node.js #экспресс #агентство jwt
Вопрос:
Я использую postman, чтобы попытаться заставить некоторые маршруты узлов работать, но не смог понять, почему мои JWT не работают. Большая часть моей работы основана на этом проекте. Вот мой код:
auth.js:
var jwt = require('express-jwt'); var jwtN = require('jsonwebtoken'); var secret = require('../config').secret; function getTokenFromHeader(req){ console.log(req.headers.authorization); if (req.headers.authorization amp;amp; req.headers.authorization.split(' ')[0] === 'Token' || req.headers.authorization amp;amp; req.headers.authorization.split(' ')[0] === 'Bearer') { return req.headers.authorization.split(' ')[1]; } return null; } var auth = { required: jwt({ secret: secret, userProperty: 'payload', getToken: getTokenFromHeader, algorithms: ['HS256'] }), optional: jwt({ secret: secret, userProperty: 'payload', credentialsRequired: false, getToken: getTokenFromHeader, algorithms: ['HS256'] }), reqNew: function(req, res, next){ var token = getTokenFromHeader(req); console.log("token ", token, " secret ", secret); if (token == null) return res.sendStatus(401) jwtN.verify(token, secret, (err, payload) =gt; { console.log(err) if (err){ return res.sendStatus(403);} req.payload = payload; next() }) } }; module.exports = auth;
И вот как выглядит мой маршрут получения пользователя:
router.get('/user', auth.required, function(req, res, next){ User.findById(req.payload.id).then(function(user){ if(!user){ return res.sendStatus(401); } return res.json({user: user.toAuthJSON()}); }).catch(next); });
Как для auth.required, так и для auth.reqNew ничего не работает. Я проверил, что правильно разделяю свои токены из заголовка, но я продолжаю получать эту ошибку в postman, когда использую токен, который я получаю от маршрута входа в систему.
{ "errors": { "message": "invalid token", "error": { "name": "UnauthorizedError", "message": "invalid token", "code": "invalid_token", "status": 401, "inner": { "name": "JsonWebTokenError", "message": "invalid token" } } } }
Вот как я генерирую JWTs:
UserSchema.methods.generateJWT = function() { var today = new Date(); var exp = new Date(today); exp.setDate(today.getDate() 60); return jwt.sign({ id: this._id, email: this.email, exp: parseInt(exp.getTime() / 1000), }, secret, {algorithm: 'HS256'} ); };
Я пробовал с = в конце и без него, но, похоже, мне это определенно нужно. Мои жетоны прекрасно декодируются на jwt.io веб-сайт с правильной информацией. Действительно не знаю, что еще попробовать, был бы очень признателен за помощь! Большое спасибо.
Комментарии:
1. Не могли бы вы, пожалуйста. показать свой жетон? И что вы имеете в виду здесь, когда я пробовал с = в конце и без = в конце ?
2. Вот жетон: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYxYjE2YmYzNzk1YjAxYzE0MzNjYTVlZSIsImVtYWlsIjoiZnJhbmt0aGV0YW5rQGdtYWlsLmNvbSIsImV4cCI6MTY0NDI0MzE5NCwiaWF0IjoxNjM5MDU5MTk0fQ.-kZvd_jF56cUQhN7wp-QdcyouRFtGkAY7k_OILwDDTw
3. И под этой частью я подразумевал, что пытался отправить токен с = в конце и без него
4. Спасибо за токен, по крайней мере, срок его действия не истек, он действителен до 22 февраля. Я не вижу никакого » = » на токене, и у него его не должно быть, потому что 3 части закодированы в base64url. Вы на 100% уверены, что секрет для подписи и проверки идентичен?