Как получить данные сеанса для запросов API?

Я хочу получить данные авторизованного пользователя. Но вместо этого я получаю данные совершенно другого пользователя. Как написать функцию 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

Глядя на вашу текущую реализацию, getProfile зависит от id, отправляемого в req.bdy, и он не привязан строго с пользователем, вошедшим в систему. Он может отправить любой идентификатор, который захочет, чтобы получить доступ к их профилю.

Suresh Prajapati 30.11.2018 08:54

@SureshPrajapati Как я могу связаться с пользователем, вошедшим в систему?

user10720571 30.11.2018 09:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
200
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны прикреплять подписанный токен к каждому 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)
  }
}

Другие вопросы по теме