Node.js无状态/无Cookie会话API身份validation

我正在build立一个API,并试图找出许多上下文中的身份validation。

会话和密码validation

API需要为我们创build和部署的客户端应用程序提供服务,并使用密码处理已authentication的请求。 发送每个请求的密码并不是一个好主意,因此首先点击login端点并获取会话ID会更有意义。 有问题的Web应用程序是用AngularJS编写的,并且应该在localStorage中跟踪自己的会话,以减轻会话劫持,并消除对cookie的依赖,以跟踪会话。

Web应用程序需要发送每个请求的会话标识符,目前在请求的主体中这样做。 这个碎片非常容易,并与API紧密结合。 我宁愿传递所有的身份validation信息,通过一个头,最好 – 而不是通过请求体,url和头部传播的许多不同的领域。

会话存储

当然, Redis真棒。 会话存储很简单,并自动垃圾收集。 不幸的是,redis中的会话难以pipe理:我不能轻易撤销给定用户的所有会话。 通过将会话存储在真正的redis-datastructure而不是全局密钥空间来添加该function,可以删除添加键控TTL的function。 我目前的解决scheme是在MongoDB用户集合中存储会话列表,并在会话活动(例如login/注销)上垃圾收集过期的会话。

会话使用connect-redis模块存储在redis中,但是随每个请求发送的会话都不包含在cookie中。 目前,我有一小块中间件,它将会话标识符从请求体中取出并放入一个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结束了expression响应时设置cookie,这不是所需的行为。

如何在Express环境下正确设置?

API密钥

我们的API还应该支持第三方应用程序的API密钥,以获得对我们系统的有限和受控的访问。 我所知道的最常见的机制是将API密钥分发给感兴趣的开发人员,并让开发人员传递API密钥作为请求的一部分。 这遇到了会话/密码authentication遇到的相同困境:每个API都需要API请求的不同部分,从主体到url到头文件。

扩展和开放标准

虽然我们不打算在初始版本中支持OpenAuth和OpenID之类的Openauthentication标准,但是我们希望创build一个框架,在该框架中添加上述标准非常简单。 其中一部分可能是统一授权凭证如何交给API,如会话/密码和API密钥支持的authentication。

另一个问题是询问是否自定义HTTP Authorization标头是一个好主意,或者自定义标头是一个更好的主意。

CRUD支持

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

TLDR

两件事情:

  1. 我们如何使用像connect-redis这样的模块而不使用基于cookie的会话。
  2. 我们应该如何configurationauthentication信息以获得最大的灵活性和互操作性?

如所给出的,这个问题是无法回答的。 会话状态。 所以你无法无状态地实现会话。

如果您确实需要无状态身份validation,那么您不能拥有会话,而应该使用HTTP身份validation机制。

如果实际上需要会话,但不希望在Cookie头中传输状态令牌,则应使用OAuth机制,该机制允许使用授权头或请求参数来保存协商的状态令牌。

我们希望创build一个框架,其中增加了所述标准是直接的

最简单也是最好的方法是使用它们开始。 不要重新发明轮子。 OAuth2被devise成可以在多个用例中轻松实现,并且在需要更多的时候有自己的扩展机制。

基于令牌的方法,你可以考虑不使用会话。

您可以使用包含至less用户标识和到期date以及服务器密钥的散列生成encryption标记。 一旦您通过login请求validation用户,甚至不需要包含密码。

令牌将在Authorization标头中传递,避免使用cookie或任何其他请求参数。

有了这个令牌,你可以识别用户,并检查到期date,而不需要在服务器上的商店,所以没有会话状态。 如果您需要根据需要过期validation令牌,则只需要一个商店。