ske*_*gse 11 authentication cookies session node.js express
我正在构建一个API并尝试在许多上下文中找出身份验证.
API需要为我们创建和部署的客户端应用程序提供服务,并使用密码处理经过身份验证的请求.对每个请求发送密码并不是一个好主意,因此首先点击登录端点并获取会话ID更有意义.有问题的webapp是用AngularJS编写的,应该在localStorage中跟踪它自己的会话,以减轻会话劫持并消除对cookie的依赖以跟踪会话.
webapp需要在每个请求中发送会话标识符,并且当前在请求正文中这样做.这很容易碎片,并与API紧密结合.我宁愿以一种方式通过标题传递所有身份验证信息,最好是 - 而不是遍布请求正文,URL和标题的许多不同字段.
当然,Redis太棒了.会话存储很简单,并自动进行垃圾收集.不幸的是,redis中的会话很难管理:我不能轻易撤销给定用户的所有会话.通过将会话存储在真正的redis-datastructure而不是全局键空间中来添加该功能会删除添加键控TTL的功能.我目前的解决方案是在MongoDB用户集合中存储会话列表,并在会话活动(例如登录/注销)上垃圾收集过期的会话.
会话使用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'
});
Run Code Online (Sandbox Code Playgroud)
这种方法很好,除了express.session
在表达响应时最终设置cookie,而这不是理想的行为.
如何在Express的上下文中正确设置?
我们的API还应支持第三方应用程序的API密钥,以获得对我们系统的有限和受控访问.我所知道的最常见的机制是将API密钥分发给感兴趣的开发人员,并让开发人员在请求中传递API密钥.这遇到了会话/密码身份验证遇到的相同困境:每个API都要求API密钥位于请求的不同部分,从正文到网址到标头.
虽然我们不打算在初始版本中支持OpenAuth和OpenID等开放式身份验证标准,但我们确实希望创建一个框架,其中添加所述标准非常简单.其中一部分可能是统一授权凭证如何传递给API,如会话/密码和API Key支持的身份验证.
另一个问题是,自定义HTTP Authorization
标头是一个好主意,还是自定义标头是一个更好的主意.
为了支持RESTful API的CRUD范例,不在身体中提供身份验证信息是有意义的,因为这会限制所有对POST请求的API请求,而CRUD建议使用各种HTTP方法.
两件事情:
归档时间: |
|
查看次数: |
5506 次 |
最近记录: |