gpt4 book ai didi

Node.js 无状态/无 Cookie session API 身份验证

转载 作者:IT老高 更新时间:2023-10-28 23:16:34 27 4
gpt4 key购买 nike

我正在构建一个 API 并尝试在多个上下文中找出身份验证。

session 和密码验证

API 需要为我们创建和部署的客户端应用程序提供服务,并使用密码处理经过身份验证的请求。在每个请求中发送密码并不是一个好主意,因此首先点击登录端点并获取 session ID 更有意义。有问题的 webapp 是用 AngularJS 编写的,应该在 localStorage 中跟踪它自己的 session ,以减轻 session 劫持并消除对 cookie 的依赖来跟踪 session 。

webapp 需要在每个请求中发送 session 标识符,目前在请求正文中这样做。这很容易分片并与 API 紧密耦合。我宁愿以一种方式传递所有身份验证信息——最好是通过 header ——而不是通过分布在请求正文、url 和 header 中的许多不同字段。

session 存储

Redis很棒,当然。 session 存储很简单,并且会自动进行垃圾收集。不幸的是,redis 中的 session 很难管理:我无法轻易撤销给定用户的所有 session 。通过将 session 存储在真正的 redis 数据结构而不是全局键空间中来添加该功能会消除添加键控 TTL 的能力。我当前的解决方案是在 MongoDB 用户集合中存储 session 列表,并垃圾收集 session 事件中过期的 session (例如登录/注销)。

session 以 connect-redis 存储在 redis 中。模块,但由于它们是随每个请求一起发送的,因此它们不包含在 cookie 中。目前,我有一小块中间件,它将 session 标识符从请求正文中取出,并将其放入 req.cookies 对象中。

var express = require('express');
var RedisStore = require('connect-redis')(require('connect'));

var app = express();
app.use(function(req, res, next) {
req.cookies = {session: req.body.session};
});
app.use(express.session({
store: new RedisStore({
client: redisClient,
prefix: 'session:'
}),
key: 'session',
secret: 'all mine'
});

这种方法效果很好,只是 express.session 在 express 响应时最终设置了 cookie,而这不是所需的行为。

如何在 Express 的上下文中正确设置?

API key

我们的 API 还应支持第三方应用程序的 API key ,以获得对我们系统的有限和受控访问。我所知道的最常见的机制是将 API key 分发给感兴趣的开发人员,并让开发人员将 API key 作为请求的一部分传递。这遇到了 session /密码身份验证遇到的相同困境:每个 API 都希望 API key 位于请求的不同部分,从正文到 url 到 header 。

扩展和开放标准

虽然我们不打算在初始版本中支持 OpenAuth 和 OpenID 等开放式身份验证标准,但我们确实希望创建一个框架,在其中添加上述标准很简单。其中一部分可能是统一将授权凭据传递给 API 的方式,就像 session /密码和 API key 支持的身份验证一样。

Another question询问自定义 HTTP Authorization header 是否是个好主意,或者自定义 header 是否更好。

CRUD 支持

为了支持 RESTful API 的 CRUD 范例,不在正文中提供身份验证信息是有意义的,因为这会将所有 API 请求限制为 POST 请求,而 CRUD 建议使用各种 HTTP 方法。

TLDR

两件事:

  1. 我们如何使用像 connect-redis 这样的模块不使用基于 cookie 的 session 。
  2. 我们应该如何配置身份验证信息以获得最大的灵 active 和互操作性?

最佳答案

正如给出的,这个问题是无法回答的。 session 状态。因此,您不能无状态地实现 session 。

如果你真的想要无状态身份验证,那么你不能有 session ,你应该使用 HTTP Authentication机制。

如果您确实需要 session ,但不想在 Cookie header 中传输状态 token ,那么您应该使用 OAuth机制,它允许使用 Authorization header 或请求参数来保存协商的状态 token 。

we do wish to create a framework in which the addition of said standards is straightforward

最简单和最好的方法就是从它们开始。不要重新发明轮子。 OAuth2 旨在在多个用例中轻松实现,并且如果您需要更多,它有自己的扩展机制。

关于Node.js 无状态/无 Cookie session API 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19388434/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com