javascript - Express Node 如何避免在每次请求时发送用户数据?

标签 javascript node.js express

我想知道避免在每个请求上发送用户数据的最佳方法是什么,
假设我想从用户帐户添加产品,我必须发送给用户。或者我想订购一些东西,我必须发送给用户。
我想到了这样的事情:

app.use(async (req, res, next) => {
  if (!req.body.userId) {
    return next();
  }
  const user = await enteties.User.findByPk(req.body.userId);
  req.user = user;
  next();
});

但它还要求我根据每个请求向用户发送..

必须有一种方法可以避免几乎每次请求时都将用户数据发送到服务器。
另外,它将使我的所有请求类型为“post”,因为我必须发送给用户,甚至“get”请求现在也变成“posts”,当然这是不正确的

最佳答案

如果您正确实现 JWT token ,则无需发送登录的用户 ID。

JWT token 包含一个有效负载部分,该部分基本上是您要设置的任何 JSON 数据。这基本上是存储在用户计算机中的分散 session 。创建 JWT token 时,您通常会执行以下操作:

const jwt = require('jsonwebtoken');
const config = require('./config');

function generateToken(user) {
    let payload = {
        sub: user.id
    };

    return jwt.sign(payload, config.secret, {
        algorithm: 'HS512', // choose algorithm appropriate for you
        expiresIn: config.expires
    })
}

该有效负载部分允许您发送用户识别信息。在上面的例子中,是用户 ID。要从请求中获取该 ID,只需验证它即可:

app.use((req, res, next) => {
    const token = req.get('Authorization');
    jwt.verify(token, config.secret, (err, payload) => {
        if (err) {
            next(err);
        }
        else {
            req.user = payload; // user.sub is the user id
            next();
        }
    });
});

或者您可以使用诸如express-jwt之类的库为您做:

const expressJwt = require('express-jwt');
const express = require('express');
const config = require('./config');

const app = express();

app.use(expressJwt({ secret: config.secret }); // use express-jwt like any
                                        // middleware, you can even install
                                        // it on specific routes.

现在,在您的 Controller /路由中,您可以简单地提取 req.user 对象中的有效负载。无效的 token 或没有 token 的请求将完全跳过您的处理程序并立即返回错误或未经授权的响应:

app.get('/some/endpoint', (req, res) => {

    console.log('user is', req.user.sub); // note: req.user is our payload

});

其他技巧:

正如我所提到的,有效负载基本上是用户定义的。如果您需要跟踪其他用户信息(例如 Angular 色或权限),您可以将它们存储在 JWT token 中:

// Example payload
let payload = {
    sub: user.id,
    admin: user.role === 'admin',
    gender: user.gender
};

这减少了处理用户所需的数据库请求的数量。使认证系统完全去中心化。例如,您可能有一个使用此 JWT token 的服务,该 token 未连接到您的用户数据库,但需要检查用户是否是管理员。通过正确的负载,该服务甚至不需要访问用户数据库。

但请注意,有效负载未加密。它只是 Base64 编码的。这意味着 token 中的信息可以被任何有权访问它的人轻松读取(通常是用户,但要注意第三方脚本)。因此,理想情况下,如果您的网站上有第 3 方脚本,则不应在有效负载中存储可 dox 的信息(话又说回来,如今任何人在没有任何库或框架的情况下从头开始编写整个前端是非常不寻常的)

另请注意,您在有效负载中放入的内容越多,您的 token 就越大。

关于javascript - Express Node 如何避免在每次请求时发送用户数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61819604/

相关文章:

node.js - Passport.js : how to access user object after authentication?

javascript - 移动(平移)模型后绕模型中心旋转

javascript - ajax php jquery实时保存计数器

node.js - 将 mongodb node.js 包与 mongodb 版本 2.4 一起使用

javascript - Node.js 和 Express.js 错误 : Can't set headers after they are sent

mysql - 类型错误 : Cannot read property 'name' of undefined

javascript - 如何从 moment.js 进行完整复制

javascript - 在返回的 AJAX 内容中调用用户定义的 JS 函数

javascript - Try 语句永远不会在不抛出错误的情况下通过

javascript - Node.js/Express.js 将 POST 请求转发到另一个域