在以API为中心的应用程序上使用JWT而不是Cookie时有很多优点,我知道您可以在通过浏览器访问应用程序时将令牌存储在sessionStorage上.您可以在JS代码上设置拦截器,以便在GET请求的Authorization标头上注入JWT令牌 - 只要这些GET请求来自对用户进行身份验证的相同代码.
但是,当用户通过身份验证后会发生什么,然后打开新选项卡并尝试访问应用程序/站点的不同受限区域(甚至同一区域)?在这种情况下,没有拦截器在新选项卡上的Authorization标头上注入令牌.我想服务器将收到GET请求,在Authorization标头上查找JWT令牌,但不会找到它,拒绝请求.
当您使用Cookie时,它们始终由浏览器本地发送,您不必担心新的选项卡和身份验证.
有没有办法在用户在第一个选项卡中进行身份验证时为浏览器上的域全局设置Authorization标头?如果有的话,这个问题的常用解决方案是什么?
(使用Sails.js)
我正在测试webworker-threads(https://www.npmjs.com/package/webworker-threads),以便在Node上进行长时间运行的进程,以下示例看起来很好:
var Worker = require('webworker-threads').Worker;
var fibo = new Worker(function() {
function fibo (n) {
return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}
this.onmessage = function (event) {
try{
postMessage(fibo(event.data));
}catch (e){
console.log(e);
}
}
});
fibo.onmessage = function (event) {
//my return callback
};
fibo.postMessage(40);
Run Code Online (Sandbox Code Playgroud)
但是只要我添加任何代码来查询Mongodb,它就会抛出异常:(在查询中不使用Sails模型,只是为了确保代码可以自己运行 - db没有密码)
var Worker = require('webworker-threads').Worker;
var fibo = new Worker(function() {
function fibo (n) {
return n > 1 ? fibo(n - …Run Code Online (Sandbox Code Playgroud) 根据REST原则,我知道服务器的所有POST都应该用于创建资源; 修改服务器上的内容.如果要获取信息,请使用GET.
但是,您需要发送大量信息以获取资源的情况呢?
例如,复杂的搜索参数对于URL来说太长了.或者,假设您想要发送要搜索的图像,例如OCR或类似的图像比较.
在这些情况下,似乎有必要将数据POST到服务器,但结果不会是变化,只是信息.POST图像,接收服务器上存在的类似图像的列表.
我不想构建违反这些原则的REST API,除非它们实际上不是违规行为.
编辑
到目前为止,似乎所有答案都是正确的(!):Sergio和Kay对于在需要时"弯曲规则"的实际价值是正确的.但uriDium有一个好点:
图像上传实际上导致服务器发生变化:有一个新文件,虽然是暂时的.可以将复杂搜索视为"文档".
我想我们可以考虑"短暂的"变化的概念,"短暂的POST",其中服务器被更改并产生新的短暂资源.在这种情况下,对于RESTful考虑因素,可能这可能是以下行为:
我会考虑用第2步的完整短暂资源做出回应并在那里结束互动,只是为了反叛:-)
参考:https : //github.com/balderdashy/skipper/issues/49
适配器:skipper-gridfs
基本控制器代码:
req.file('fileTest')
.upload({
// You can apply a file upload limit (in bytes)
maxBytes: maxUpload,
adapter: require('skipper-gridfs'),
uri: bucketConnect,
saveAs : function (__newFileStream,cb) {
cb(null, __newFileStream.filename);
}
}, function whenDone(err, uploadedFiles) {
if (err) {
var error = { "status": 500, "error" : err };
return res.serverError(error);
}else {
Run Code Online (Sandbox Code Playgroud)
我有一个jQuery-File-Upload客户端(https://blueimp.github.io/jQuery-File-Upload/),通过使用此处描述的jqXHR中止来实现“取消”过程(https://github.com/blueimp/ jQuery-File-Upload / wiki / API):
$('button.cancel').click(function (e) {
jqXHR.abort();
});
Run Code Online (Sandbox Code Playgroud)
客户端中止后,服务器崩溃并显示以下消息:
events.js:72
throw er; // Unhandled 'error' event
^
Error: Request …Run Code Online (Sandbox Code Playgroud) 在创建Twilio Zap(和其他人)时,我们需要为您现有的Twilio帐户提供帐户Sid和帐户令牌.
我想这是由Zapier存储在某个地方(希望有可逆加密),否则它们无法执行将来的请求.有人知道这有多安全吗?他们是否发布了有关如何保护这些数据的信息?
编辑
好吧,没有什么谷歌搜索无法帮助
https://zapier.com/help/data-privacy/
是的,他们使用AES加密数据并分别存储密钥.我想总会有数据泄露的危险,但这是权衡.
我只是想知道为什么他们自己的登录凭证使用SHA(1000次迭代),而我相信最推荐的是bcrypt.
假设我们有一个用户变量$_SESSION['variable'],在用户访问页面时可以对其进行修改,也可以不进行修改。
假设同一用户打开了多个浏览器窗口,并且以某种方式同时向服务器发出了会话变量更改所导致的请求。
问题:
由于这些更改针对相同的变量,因此服务器如何“排队”这些更改?这里是否可能发生服务器错误?
有没有一种方法可以“锁定”用于读取/写入的会话变量,以便在更改其值之前执行某种状态检查?
编辑 (感谢Unheilig的清理工作)
关于“排队”,我对两个请求同时到达会发生什么感兴趣:
将X更改为1
将X更改为2
我知道这似乎不是现实世界,但是在设计某些东西时我才想到。如果系统允许来自同一用户的太多并发请求,可能会成为问题。
sails.js ×2
cookies ×1
credentials ×1
file-upload ×1
javascript ×1
jwt ×1
methods ×1
node.js ×1
php ×1
principles ×1
rest ×1
security ×1
session ×1
skipper ×1
tabs ×1
web-worker ×1
zapier ×1