аутентификация и авторизация пользователей. Отображение только профиля пользователя - PullRequest
0 голосов
/ 03 мая 2020

У меня проблема с аутентификацией пользователя после входа. Это часть расширения моих знаний, и теперь я застрял с этим.

Мой код выглядит так:

Маршрут:

const express = require('express');
const router = express.Router();

/* import controllers */
const {
  findById,
  isAuth,
  isAdmin,
} = require('../controllers/user.controller.js');
const { requierSignin } = require('../controllers/auth.controller.js');

router.param('userId', findById);

router.get('/test/:userId', requierSignin, isAuth, findById, (req, res) => {
  res.json({ user: req.profile });
});

Здесь я должен войти, найти пользователя по идентификатору и моему методу авторизации. Это тестовый маршрут. Как я говорю о своих контроллерах: Пользователь:

const User = require('../models/user.models');

//user middleware
exports.findById = async (req, res, next, id) => {
  try {
    let user = await User.findById(id).exec();
    if (!user) {
      return res.status(401).json({
        errors: [
          {
            msg: 'User not found',
          },
        ],
      });
    }
    req.profile = user; // this will get user profile based on User
    next();
  } catch (err) {
    console.error(err.message);
    res.status(500).send('Server error');
  }
};

/* check if user is authenticated */
exports.isAuth = (req, res, next) => {
  /* id we have user that will send id and is auth */
  let user = req.profile && req.auth && req.profile._id == req.auth._id;

  console.log(req.profile);
  console.log('auth', req.auth);
  console.log('id', req.profile._id);
  console.log('user', user);
  if (!user) {
    return res.status(403).json({
      errors: [
        {
          msg: 'Access Denied',
        },
      ],
    });
  }
  next();
};

и мой метод входа из auth.controller

const config = require('config');

const jwt = require('jsonwebtoken'); //generate token
const expressJwt = require('express-jwt'); //auth check

const User = require('../models/user.models');
const secret = config.get('jwtSecret');

exports.requierSignin = expressJwt({
  secret,
  userProperpty: 'auth',
});

Это только часть этого кода, но если остальные будут нужны, я будет обновлять его, насколько я получаю. Пользователь авторизуется, и получение профиля работает. Но я хочу защитить другие профили пользователей с помощью isAuth. Это заставляет меня "Доступ запрещен". Из журнала консоли я получил

auth undefined
id 5eaac004200b95869cc76531
user undefined
GET /api/test/5eaac004200b95869cc76531 403 88.591 ms - 36

Но когда я изменил в своем методе isAuth, пользователь будет только:

let user = req.profile

пользователь определен.

Не уверен, что я здесь отсутствует: / Не знаю, почему я не получаю свой «auth» ._id, и это вызывает проблемы

github repo

1 Ответ

0 голосов
/ 03 мая 2020

Получил это рабочее

Ошибка была в моем пользователе, войдите в метод:

const payload = {
      user: {
        id: user._id,
        email: user.email,
        name: user.name,
        role: user.role,
      },
    };
    return res.json({
      token,
      payload,
    });

В моей полезной нагрузке я отправил

id:user._id

Но когда я генерировал токен я делал отправку идентификатора

// generate a token with id and secret
    const token = jwt.sign({ _id: _id }, secretJwt);

Так что каждый раз, когда myt prtected rout проверял идентификатор из токена и пользователя

 let user = req.profile && req.auth && req.profile._id == req.auth._id;

Это было ложно, поскольку не было идентификатора для сравнения. Установка _id в id решила мою проблему

// generate a token with id and secret
    const token = jwt.sign({ _id: _id }, secretJwt);

Для меня это был взломщик мозгов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...