Я хочу получить данные авторизованного пользователя. Но вместо этого я получаю данные совершенно другого пользователя. Как написать функцию getProfile для отображения данных текущего пользователя?
контроллеры / auth.js:
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const db = require('../config/db.config.js')
const User = db.user
module.exports.login = async function(req, res) {
const candidate = await User.findOne({
where: {
username: req.body.username
}
})
if (candidate) {
const passwordResult = bcrypt.compareSync(req.body.password, candidate.password)
if (passwordResult) {
const token = jwt.sign({
username: candidate.username,
userId: candidate._id
}, process.env.SECRET_OR_KEY, {expiresIn: 60 * 60})
res.status(200).json({
token: `Bearer ${token}`
})
} else {
res.status(401).json({
message: 'Passwords do not match. Try again.'
})
}
} else {
res.status(404).json({
message: 'User with this login was not found.'
})
}
}
module.exports.getProfile = async function(req, res) {
try {
const user = await User.findOne({id: req.body.id})
res.status(200).json(user)
} catch(e) {
errorHandler(res, e)
}
}
маршруты / auth.js:
const express = require('express')
const router = express.Router()
const controller = require('../controllers/auth')
const passport = require('passport')
router.post('/login', controller.login)
router.get('/profile', passport.authenticate('jwt', {session: false}), controller.getProfile)
module.exports = router
@SureshPrajapati Как я могу связаться с пользователем, вошедшим в систему?





Вы должны прикреплять подписанный токен к каждому HTTP-запросу от клиента либо с помощью настраиваемого HTTP-заголовка, либо с помощью cookie. Этот токен отправляется только после успешного входа в систему, который содержит идентификатор пользователя и другую информацию.
После того, как вы начнете получать этот токен, вы можете проверить его (проверка истечения срока действия или какое-либо ручное изменение) с помощью промежуточного программного обеспечения, и эти данные токена будут фактическими данными пользователя, принадлежащими пользователю, вошедшему в систему.
Теперь вы читаете этот заголовок / файл cookie, чтобы получить информацию о пользователе, отправившем запрос, и затем можете отправлять только соответствующие данные.
Допустим, клиент отправляет вам информацию о токене в заголовке под названием tkn. Проверка вашего токена может быть следующей:
var jwt = require('jsonwebtoken');
const SECRET = 'whatulike';
function verifyToken(req, res, next) {
var token = req.headers.tkn || "";
if (!token.length)
return unauthorised(res, 'Token absent');
jwt.verify(token, SECRET, function(err, decoded) {
if (err)
return unauthorised(res, 'Failed to authenticate token.');
req.tkn = decoded.id;
next();
});
}
function unauthorised(res, msg){
const sc = 401;
logger.warn(`${sc} - Unauthorised request ${res.req.originalUrl}`);
res.status(sc).send({msg});
}
module.exports.verifyToken = verifyToken;
А на стороне обработчика вы можете читать данные tkn, например:
module.exports.getProfile = async function(req, res) {
try {
const user = await User.findOne({id: req.tkn.userId})
res.status(200).json(user)
} catch(e) {
errorHandler(res, e)
}
}
Глядя на вашу текущую реализацию,
getProfileзависит отid, отправляемого вreq.bdy, и он не привязан строго с пользователем, вошедшим в систему. Он может отправить любой идентификатор, который захочет, чтобы получить доступ к их профилю.