Как сообщить бэкэнду, что токен доступа, отправленный пользователем, действителен - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь создать веб-сайт для входа администратора, чтобы добавить данные в базу данных. На самом деле я уже написал API для администратора, когда они входят в сеть. Токен доступа будет сгенерирован jwt, передан во внешний интерфейс и сохранен в локальном хранилище пользователя. Я знаю, что jwt можно добавить в заголовок пользователя req.

Но как дать бэк-энду знать, что токен доступа, отправленный пользователем, действителен?

В моей базе данных естьТаблица пользователей, в которой сохраняются электронная почта пользователей и хешированный пароль. Является ли хорошим способом для бэк-энда декодировать токен доступа для получения электронной почты пользователя и поиска в БД, когда пользователь вызывает API с заголовками?

Эта часть моей функции Lambda для входа в Интернет:

const { JWT_SECRET } = process.env
            const accessToken = jwt.sign(
              { username: event.username },
              JWT_SECRET,
              { expiresIn: '7days' }
            )

также в моей БД. структура данных:

{
  'email": "***",
  "id": "*",
  "password": "***",
  "username": "***"
}

Во внешнем интерфейсе, скажем, есть API для отправки новых данных:

export const addNewData = function (accessToken, newValue) {
  return apiClient.post(***API endpoint***',
    newValue, {
      headers: {
        Authorization: `Bearer ${accessToken}`
      }
    })

1 Ответ

0 голосов
/ 03 ноября 2019

Лучший способ проверить пользователей - это использовать промежуточное программное обеспечение. Ниже приведен пример фрагмента для регистрации пользователя и проверки пользователя с использованием промежуточного программного обеспечения.

const auth = require("../middleware/auth");
const bcrypt = require("bcrypt");
const _ = require("lodash");
const { User, validate } = require("../models/user");
const express = require("express");
const router = express.Router();

router.post("/login", async (req, res) => {
  const { error } = validate(req.body);
  if (error) return res.status(400).send(error.details[0].message);

  let user = await User.findOne({ email: req.body.email });
  if (user) return res.status(400).send("User already registered.");

  user = new User(_.pick(req.body, ["name", "email", "password"]));
  const salt = await bcrypt.genSalt(10);
  user.password = await bcrypt.hash(user.password, salt);
  await user.save();

  const token = user.generateAuthToken();
  res
    .header("x-auth-token", token)
    .header("access-control-expose-headers", "x-auth-token")
    .send(_.pick(user, ["_id", "name", "email"]));
});

Здесь представлено промежуточное программное обеспечение для проверки токена пользователя изпользовательский заголовок.

const jwt = require("jsonwebtoken");
const config = require("config");

module.exports = function(req, res, next) {
  const token = req.header("x-auth-token");
  if (!token) return res.status(401).send("Access denied. No token provided.");

  try {
    const decoded = jwt.verify(token, config.get("jwtPrivateKey"));
    req.user = decoded;
    next();
  } catch (ex) {
    res.status(400).send("Invalid token.");
  }
};

Ниже приведен фрагмент использования промежуточного программного обеспечения для аутентификации пользователя перед извлечением данных профиля пользователя.

router.get("/me", auth, async (req, res) => {
  const user = await User.findById(req.user._id).select("-password");
  res.send(user);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...