我有一个关于如何使用访问令牌和API密钥构建REST API的问题.
我有一个需要身份验证的API.我想启用两个用例:
用户使用OAuth2(密码授予)登录界面,并被授予临时访问令牌.此令牌用于验证用户身份.因此,使用API的UI可以获取数据并显示它.
我还希望用户有一个API密钥来执行相同的调用,但在其应用程序中.显然,与访问令牌相反,我希望API密钥能够长久存在.此外,与绑定到给定用户的访问令牌相反(如果我们引入团队机制,每个用户将拥有不同的访问令牌,尽管他们访问相同的资源),API密钥对于项目应该是唯一的.
虽然相似,但我不确定我应该如何构建它.我认为,在内部,API密钥和访问令牌都应存储在同一个表中,但API密钥没有到期时间.我对吗?
我不确定的一件事是客户的概念.似乎在规范中,客户端更像是外部应用程序.不过我可以在这里实际使用这个概念吗?
例如,每个"项目"实际上是一个不同的客户端(尽管这里的客户端是相同的应用程序,而不是第三方开发人员创建的应用程序).
因此,如果用户A在系统上创建帐户,则将使用长期访问令牌(也称为API密钥)自动创建客户端A,其中访问令牌绑定到客户端A. 例如,这可以用于直接在他的代码上执行API调用.
然后,如果用户A登录仪表板,将创建一个临时访问令牌,但这次没有应用程序,但与用户关联,生命周期短.
这听起来有道理吗?有没有人已经实现了这样的事情?
谢谢!
我想在使用带货币的NumberFormatter PHP类(来自Intl扩展名)时设置精度为0 .但是我得到了一些奇怪的结果.这里:
$numberFormatter = new NumberFormatter('en-US', NumberFormatter::CURRENCY);
$numberFormatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 0);
echo $numberFormatter->formatCurrency('45', 'USD');
Run Code Online (Sandbox Code Playgroud)
它输出$45,这是我想要的.但是,如果我EUR使用相同的设置更改货币:
echo $numberFormatter->formatCurrency('45', 'EUR');
Run Code Online (Sandbox Code Playgroud)
它输出€45.00(虽然我明确地设置为零精度).
更奇怪的是,如果我将语言环境设置为fr-FR,它会按预期输出数字:
$numberFormatter = new NumberFormatter('fr-FR', NumberFormatter::CURRENCY);
$numberFormatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 0);
echo $numberFormatter->formatCurrency('45', 'EUR');
Run Code Online (Sandbox Code Playgroud)
它输出45 €.
这是一个错误吗?
我最近被介绍到AWS,我真的很喜欢它.但是,我问自己一些关于多区域架构的问题(可能是愚蠢的).
假设一个应用程序被欧洲人和亚洲人使用.我的第一个想法是在欧洲添加EC2实例,以及在欧洲保存静态数据和SQS队列以及ElastiCache的S3存储桶.对于欧洲人来说,这将是非常快的,但对亚洲人来说则要慢一些.
为了解决这个问题,我将为静态数据添加CloudFront,以便为亚洲人快速提供图像.但是,对服务器的请求(Ajax请求......)仍然会有一些延迟,因此解决方案是在新加坡/东京地区添加EC2实例.
然而,出现了新的问题:如果请求被分派到东京EC2实例,那么如果它需要从SQS接收存储在欧洲的消息或访问ElastiCache数据=>延迟再次+区域间转移的成本.那么我们还需要在亚洲添加SQS和ElastiCache吗?
也许我错过了一些东西,跨区域的AWS请求速度非常快,但据我所知,如果我们想要多区域的快速体验,我们基本上需要在每个区域复制所有服务(除了S3可能,如我们可以使用CloudFront,如果亚洲的SQS工作需要访问欧洲的S3资源,我想我们可以忍受延迟.
无论如何,我是否理解正确?您是否有任何关于如何针对多个区域的架构应用程序的资源?
谢谢 :)
我正在使用Apache来返回CORS响应来加速请求(之前我在应用程序代码中处理了这个问题,但这太慢了).在我的VirtualHost中,我有以下Apache代码:
SetEnvIfNoCase Access-Control-Request-Method "(GET|POST|PUT|DELETE|OPTIONS)" IsPreflight=1
SetEnvIfNoCase Origin "http(s)?://(myorigin.com)$" AccessControlAllowOrigin=$0$1
Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" env=IsPreflight
Header always set Access-Control-Allow-Headers "Content-Type, Authorization, Accept" env=IsPreflight
Header always set Access-Control-Max-Age "7200" env=IsPreflight
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteCond %{ENV:IsPreflight} 1
RewriteRule ^(.*)$ $1 [R=200,L]
Run Code Online (Sandbox Code Playgroud)
这实际上是非常好的.它检测请求是否是预检请求,如果是,则发送相应的标头.只有一个问题:预检请求返回200(所以浏览器发送正常请求),但正文是200 ERROR(哈哈):
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>200 OK</title>
</head><body>
<h1>OK</h1>
<p>The server encountered an internal error or
misconfiguration and was unable to complete
your request.</p>
<p>Please …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 DynamoDB 实现基于游标的分页(在 DynamoDB 中进行分页绝对不容易......),使用ExclusiveStartKey.
我的表索引由“id”组成,而“owner”(分区键)和“created_at”(范围键)上有一个 GSI。
query通过指定 GSI 索引并使用“owner”属性,我可以使用请求轻松检索前 10 条记录。
但是,在下一个请求中,ExclusiveStartKey只有当我指定两个索引中的三个元素(因此“id”、“owner”和“created_at”)时,才有效。
虽然我理解“id”和“owner”,因为它们都是分区键并且需要“定位”记录,但我不明白为什么 DynamoDb 要求我指定“created_at”。这很烦人,因为这意味着消费者不仅必须提交“id”作为游标,还必须提交“created_at”。
由于DynamoDb可以使用“id”(保证唯一)找到记录,为什么我需要指定这个created_at?
谢谢
我有一个非常复杂的渲染视图,涉及某种递归(典型的文件夹/文件嵌套列表).它包含异构对象(文件夹和文件)这一事实使得编写Handlebars模板变得更加困难.
因此,我发现的唯一解决方案是创建一个视图,并手动填充渲染缓冲区.我带来了以下解决方案:
App.LibraryContentList = Ember.View.extend({
tagName: 'ol',
classNames: ['project-list', 'dd-list'],
nameChanged: function() {
this.rerender();
}.observes('content.@each.name'),
render: function(buffer) {
// We only start with depth of zero
var content = this.get('content').filterProperty('depth', 0);
content.forEach(function(item) {
this.renderItem(buffer, item);
}, this);
},
renderItem: function(buffer, item) {
switch (item.constructor.toString()) {
case 'App.Folder':
this.renderFolder(buffer, item);
break;
case 'App.File':
this.renderFile(buffer, item);
break;
}
},
renderFolder: function(buffer, folder) {
buffer.push('<li class="folder dd-item">');
buffer.push('<span class="dd-handle">' + folder.get('name') + '</span>');
// Merge sub folders and files, and sort them by …Run Code Online (Sandbox Code Playgroud) 我发现了一些奇怪的东西,并且在 CSS 自定义属性规范中找不到任何相关内容。这是一个简单的例子:https ://codepen.io/bakura10/pen/RwxNPxz
:root {
--background: red;
}
.test {
position: relative;
}
.test::before {
content: '';
width: 100%;
height: 100%;
top: 0;
left: 0;
background: var(--background);
}Run Code Online (Sandbox Code Playgroud)
<div class="test">
TEST
</div>Run Code Online (Sandbox Code Playgroud)
正如您所看到的,尽管变量 --background 是在根范围定义的,但它根本无法从 before 或 after 伪元素访问。
为什么会这样?
在我的EmberJS应用程序中,每当我无法访问资源时,我都会使用各种"错误"模板来呈现特定的错误消息.例如,我有一个名为"reset-password/error.hbs"的模板,当我尝试访问无效的重置密码时会呈现该模板.
这非常有效.
但是今天,我在ApplicationRoute中添加了一个"错误"操作.目标是捕获可能在所有页面中发生的非常具体的错误(401错误),并且我想使用它来使我的会话无效.因此,在我的应用程序路由中,我有以下代码:
export default Ember.Route.extend({
actions: {
error: function(result) {
if (result.status === 401) {
this.get('session').invalidate();
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
问题是,使用此代码,我的"reset-password"错误模板不再显示.天真地,我认为Ember,在"reset-password/index"路线上发生错误,会:
但似乎很快就会定义一个"错误"动作,即使它在层次结构中更高,它也完全取代了可能在这里的任何模板......
我怎么能解决这个问题,仍然有两个错误处理程序?我试图在错误操作中调用"_super",但没有结果.
谢谢!
ember.js ×2
apache ×1
api ×1
architecture ×1
cors ×1
css ×1
intl ×1
oauth ×1
pagination ×1
php ×1
rest ×1
scalability ×1
views ×1