【问题标题】:How to let the back end to know that the access token sent by user is valid如何让后端知道用户发送的访问令牌是有效的
【发布时间】:2020-02-28 20:20:29
【问题描述】:

我正在尝试为管理员登录创建一个网站,以将数据添加到数据库中。实际上,当他们登录网络时,我已经为管理员编写了一个 API。 jwt 将生成访问令牌,传递到前端并保存到用户的本地存储。我知道 jwt 可以添加到用户请求的标题中。

但是如何让后端知道用户发送的访问令牌是有效的呢?

在我的数据库中,我有一个保存用户电子邮件和散列密码的用户表。当用户调用带有标头的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}`
      }
    })

【问题讨论】:

  • 您可以在后端解码 jwt 令牌以检查其有效性。您可以创建令牌,使其包含来自用户的一些唯一数据,例如用户 ID。然后您可以使用该用户 ID 来获取用户数据。
  • 你能在这里放一些你刚刚为它做的代码吗??
  • @RajarshiDas 我添加了一些代码

标签: node.js reactjs amazon-dynamodb


【解决方案1】:

验证用户的最佳方法是使用中间件,下面是一个示例 sn-p,用于记录用户并使用中间件验证用户。

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.");
  }
};

这是在检索用户配置文件数据之前使用中间件对用户进行身份验证的 sn-p。

router.get("/me", auth, async (req, res) => {
  const user = await User.findById(req.user._id).select("-password");
  res.send(user);
});

【讨论】:

  • 对不起,我不知道如何在 AWS lambda 中添加中间件...
猜你喜欢
  • 2020-12-18
  • 2023-03-19
  • 2020-09-05
  • 2014-05-13
  • 2019-03-09
  • 2015-05-17
  • 2019-04-01
  • 2022-01-20
  • 2019-11-19
相关资源
最近更新 更多