我正在开发一个需要身份验证的REST API.因为身份验证本身是通过HTTP上的外部Web服务发生的,所以我推断我们会分配令牌以避免重复调用身份验证服务.这让我整整地回答了我的第一个问题:
这真的比仅要求客户端在每个请求上使用HTTP Basic Auth并缓存对身份验证服务端的调用更好吗?
Basic Auth解决方案的优点是在内容请求开始之前不需要完整的服务器往返.令牌可能在范围上更灵活(即仅授予对特定资源或操作的权限),但这似乎比我更简单的用例更适合OAuth上下文.
目前令牌是这样获得的:
curl -X POST localhost/token --data "api_key=81169d80...
&verifier=2f5ae51a...
×tamp=1234567
&user=foo
&pass=bar"
Run Code Online (Sandbox Code Playgroud)
的api_key,timestamp并且verifier被所有请求所需."验证者"由以下人员返回:
sha1(timestamp + api_key + shared_secret)
Run Code Online (Sandbox Code Playgroud)
我的意图是只允许来自已知方的呼叫,并防止呼叫被逐字重用.
这够好吗?漏杀?矫枉过正?
有了令牌,客户可以获得资源:
curl localhost/posts?api_key=81169d80...
&verifier=81169d80...
&token=9fUyas64...
×tamp=1234567
Run Code Online (Sandbox Code Playgroud)
对于最简单的呼叫,这似乎有点可怕.考虑到最终shared_secret将嵌入(至少)一个iOS应用程序的意愿,我认为它可以被提取出来,这甚至提供了一种超出虚假安全感的东西吗?
导致我尝试取消此过程的特定查询是:
assets.example.com如果父域example.com已经解析,子域的DNS查找会更快吗?
通过我(天真)的理解,将域名转换为IP地址的基本过程非常简单.十三个根服务器的地址,他们知道如何解析像com和的顶级域名net,是在网络硬件中进行硬编码的.在查找的情况下example.com,我们的本地DNS服务器(可能是我们的路由器)要求其中一个根服务器在哪里找到顶级域名服务器com.然后它会询问结果名称服务器是否知道如何解决example.如果确实如此,我们就完成了,如果没有,我们就会被传递到另一台服务器.在这个过程中的每个域名服务器可能是缓存,这样在一段时间我们的本地路由器现在知道随便到哪里寻找com和example,而com服务器将知道去哪里找example.
不过,我真的不明白.
comTLD名称服务器不知道如何解决example,它如何解决其他名称服务器要检查?或者这只是意味着example.com无法解决?维基百科解释说,一些DNS服务器将缓存与递归查询实现相结合,允许它们提供缓存命中并可靠地解决缓存未命中问题.我不明白这些服务器是如何被查询的,或者解析算法如何(甚至广泛地)起作用.
回顾我最初的问题,假设A记录在同一个名称服务器上,我可能会选择"否".这准确吗?
我正在编写一个小的node.js应用程序,它从HTML表单接收多部分POST并将传入的数据传递给Amazon S3.的强大的模块提供了多部分解析,露出各部分作为节点流.该诺克斯模块处理PUT到S3.
var form = new formidable.IncomingForm()
, s3 = knox.createClient(conf);
form.onPart = function(part) {
var put = s3.putStream(part, filename, headers, handleResponse);
put.on('progress', handleProgress);
};
form.parse(req);
Run Code Online (Sandbox Code Playgroud)
我通过socket.io向浏览器客户端报告上传进度,但是很难获得这些数字以反映节点上传到s3的真实进度.
当浏览器到节点上传瞬间发生时,就像节点进程在本地网络上运行时一样,进度指示器立即达到100%.如果文件很大,即300MB,则进度指示器缓慢上升,但仍然比我们的上游带宽允许的速度快.在达到100%进度后,客户端然后挂起,大概等待s3上传完成.
我知道在内部putStream使用Node的stream.pipe方法,但我不明白这是如何工作的细节.我的假设是节点尽可能快地吞噬输入数据,将其丢入内存.如果写入流可以足够快地获取数据,则很少有数据一次保存在存储器中,因为它可以被写入和丢弃.如果写入流速度很慢,就像在这里一样,我们可能必须将所有传入数据保留在内存中,直到可以写入为止.由于我们正在侦听data读取流上的事件以便取得进展,因此我们最终报告上传速度比实际速度快.
我对这个问题的理解是否接近标记?我该怎么办呢?我需要坐下来脏write,drain和pause?
我的项目实现了"使用Twitter登录"OAuth舞蹈,并呈现一个页面,显示当前用户所遵循的所有用户.
# /views/user/show.html.erb
<h1>Users You Follow</h1>
<%= render :partial => 'followed_user', :collection => @current_user.following %>
Run Code Online (Sandbox Code Playgroud)
following 是Users模型的虚拟属性.
# /users/models/user.rb
def following
result = twitter_request_authenticated('get_following')
parse_body(result)
end
Run Code Online (Sandbox Code Playgroud)
首先,因为我是Rails(和MVC)的新手,我不得不问:这是一个合适的抽象吗?这些'跟随用户'本身应该被建模吗?
而现在真正的问题是:
在每个页面加载上点击Twitter获取此信息似乎是不必要的.如果我们想在给定的时间段内缓存此类API调用的结果(并使方法可用于方便地刷新该缓存),那么我们该怎么做呢?这只是将API调用的返回值存储在数据库列中的问题,以及"到期"列,并且只在该列值为空或cache_expires <now时调用API?如果是这样,那听起来可能更好地位于自己的模型中.思考?
有人可以推荐存储一般网站首选项的最佳做法吗?例如,如果脚本未设置一个默认页面标题,或者要在内容框中显示的特色项目数,或者系统在上载图片时应该制作的缩略图大小列表.集中这些值具有明显的好处,即允许人们轻松更改可能在许多页面上使用的首选项.
我的默认方法是将这些首选项作为属性/值对放在*gulp*EAV表中.
这个表不可能变得很大,所以我不太担心性能.我的架构的其余部分是关系型的.它确实会让一些该死的丑陋查询:
$sql = "SELECT name, value FROM preferences"
. " WHERE name = 'picture_sizes'"
. " OR name = 'num_picture_fields'"
. " OR name = 'server_path_to_http'"
. " OR name = 'picture_directory'";
$query = mysql_query($sql);
if(!$query) {
echo "Oops! ".mysql_error();
}
while($results = mysql_fetch_assoc($query)) {
$pref[$results['name']] = $results['value'];
}
Run Code Online (Sandbox Code Playgroud)
有谁能建议更好的方法?
amazon-s3 ×1
database ×1
dns ×1
formidable ×1
mysql ×1
nameservers ×1
node.js ×1
php ×1
preferences ×1
resolve ×1
rest ×1
subdomain ×1
twitter ×1