【问题标题】:REST API in MEAN stack, passed id vs id from sessionMEAN 堆栈中的 REST API,从会话传递 id 与 id
【发布时间】:2017-09-17 03:19:57
【问题描述】:

我正在使用 MEAN 堆栈构建一个 Web 应用程序。

在构建 REST API 时,我看到了很多使用以下端点的示例

/api/contacts/:id

用于 GET、PUT 和 DELETE 方法。

我做了一些不同的事情,我在 Express 框架中启用了会话,现在我可以在 req.session.req.payload._id 下看到用户文档 ID(用于 mongoDB),当我执行 HTTP 请求时,我可以访问文件。

这就是为什么我也不需要在 URL 中公开用户文档 ID HTTP 请求。

我的问题是哪种方法更好更安全?

另外,如果我不使用会话,如何在 Angular 中获取用户 ID 以传递给 HTTP 请求。

最后一个...在调用更新数据库的函数之前,我还使用 JWT 作为中间件。这给了我一些安全感,但是拥有正确令牌的用户不可能使用不同的 id 进行 HTTP 请求并通过获取、更新和删除其他用户数据吗? 这在我使用的当前方法(会话)中是不可能的

【问题讨论】:

    标签: angularjs node.js mongodb rest session


    【解决方案1】:

    当您需要将用户 ID 传递给端点时,您的客户端代码将需要知道这一点,而后端需要以某种方式提供它 - 作为返回的令牌的一部分或通常作为对成功的登录请求。客户端可以将其存储在 cookie 或本地存储中以供以后使用。

    但是,在每条路由中都必须提供用户的 ID 并不是很实用,例如:

    /api/contacts/:id
    

    当您的用户需要能够访问其他用户的联系人时,您可能需要在路由中使用 ID,并且您可能不希望在用户想要操纵他或她自己的情况下使用另一组路由联系人。

    在这种情况下,我有时在实践中看到的做法是为 ID 使用特殊值,例如“me”,并让您的后端像这样翻译所有路由:

    /api/contacts/me
    

    到:

    /api/contacts/:id
    

    其中:id 是发出请求的用户的ID,取自会话。这可以通过一个中间件来一次性替换所有路由的值,然后您的普通控制器可以像在开始时在路由中提供的那样使用它。

    【讨论】:

    • 嘿,如果我已经从会话中获取了 ID,为什么还需要“我”?我想我可以将其保留为 /api/contacts ,每个用户都会根据会话获取请求的数据。此外,我不需要用户访问其他用户数据。允许用户使用他们想要的任何 ID 进行 HTTP 请求对我来说看起来并不安全。
    猜你喜欢
    • 2015-02-25
    • 2017-12-02
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2018-08-12
    • 2023-04-05
    相关资源
    最近更新 更多