如何获取API请求的会话数据?

时间:2018-11-30 07:36:16

标签: node.js express

我想获取授权的用户数据。但是相反,我得到了一个完全不同的用户的数据。如何编写函数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)
    }
}

routes / 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 :(得分:0)

您应该通过自定义HTTP标头或在cookie中设置来自客户端的每个HTTP请求中的签名令牌。仅在成功登录后发送此令牌,其中包含用户ID和其他信息。

开始接收该令牌后,您可以使用中间件对其进行验证(检查是否已到期或进行一些手动更改),并且令牌数据将是属于登录用户的实际用户数据。

现在,您读取该标头/ 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)
  }
}