Как получить данные сеанса для запросов API? - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу получить авторизованные данные пользователя.Но вместо этого я получаю данные совершенно другого пользователя.Как написать функцию getProfile для отображения данных текущего пользователя?

controllers / 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)
    }
}

routs / 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

1 Ответ

0 голосов
/ 30 ноября 2018

Вы должны прикреплять подписанный токен в каждом 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)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...