小编Mic*_*ego的帖子

构建API密钥和访问令牌

我有一个关于如何使用访问令牌和API密钥构建REST API的问题.

我有一个需要身份验证的API.我想启用两个用例:

  1. 用户使用OAuth2(密码授予)登录界面,并被授予临时访问令牌.此令牌用于验证用户身份.因此,使用API​​的UI可以获取数据并显示它.

  2. 我还希望用户有一个API密钥来执行相同的调用,但在其应用程序中.显然,与访问令牌相反,我希望API密钥能够长久存在.此外,与绑定到给定用户的访问令牌相反(如果我们引入团队机制,每个用户将拥有不同的访问令牌,尽管他们访问相同的资源),API密钥对于项目应该是唯一的.

虽然相似,但我不确定我应该如何构建它.我认为,在内部,API密钥和访问令牌都应存储在同一个表中,但API密钥没有到期时间.我对吗?

我不确定的一件事是客户的概念.似乎在规范中,客户端更像是外部应用程序.不过我可以在这里实际使用这个概念吗?

例如,每个"项目"实际上是一个不同的客户端(尽管这里的客户端是相同的应用程序,而不是第三方开发人员创建的应用程序).

因此,如果用户A在系统上创建帐户,则将使用长期访问令牌(也称为API密钥)自动创建客户端A,其中访问令牌绑定到客户端A. 例如,这可以用于直接在他的代码上执行API调用.

然后,如果用户A登录仪表板,将创建一个临时访问令牌,但这次没有应用程序,但与用户关联,生命周期短.

这听起来有道理吗?有没有人已经实现了这样的事情?

谢谢!

api rest oauth

26
推荐指数
1
解决办法
5931
查看次数

PHP NumberFormatter和Currency,无法设置精度

我想在使用带货币的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 €.

这是一个错误吗?

php numberformatter intl

16
推荐指数
1
解决办法
3367
查看次数

多区域时的AWS架构

我最近被介绍到AWS,我真的很喜欢它.但是,我问自己一些关于多区域架构的问题(可能是愚蠢的).

假设一个应用程序被欧洲人和亚洲人使用.我的第一个想法是在欧洲添加EC2实例,以及在欧洲保存静态数据和SQS队列以及ElastiCache的S3存储桶.对于欧洲人来说,这将是非常快的,但对亚洲人来说则要慢一些.

为了解决这个问题,我将为静态数据添加C​​loudFront,以便为亚洲人快速提供图像.但是,对服务器的请求(Ajax请求......)仍然会有一些延迟,因此解决方案是在新加坡/东京地区添加EC2实例.

然而,出现了新的问题:如果请求被分派到东京EC2实例,那么如果它需要从SQS接收存储在欧洲的消息或访问ElastiCache数据=>延迟再次+区域间转移的成本.那么我们还需要在亚洲添加SQS和ElastiCache吗?

也许我错过了一些东西,跨区域的AWS请求速度非常快,但据我所知,如果我们想要多区域的快速体验,我们基本上需要在每个区域复制所有服务(除了S3可能,如我们可以使用CloudFront,如果亚洲的SQS工作需要访问欧洲的S3资源,我想我们可以忍受延迟.

无论如何,我是否理解正确?您是否有任何关于如何针对多个区域的架构应用程序的资源?

谢谢 :)

architecture scalability amazon-web-services

13
推荐指数
1
解决办法
7079
查看次数

返回Apache的空响应

我正在使用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)

apache cors

12
推荐指数
2
解决办法
6151
查看次数

DynamoDB 需要 GSI 上 ExclusiveStartKey 的所有字段,为什么?

我正在尝试使用 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?

谢谢

pagination amazon-dynamodb

7
推荐指数
1
解决办法
5015
查看次数

在EmberJS视图中以编程方式创建链接

我有一个非常复杂的渲染视图,涉及某种递归(典型的文件夹/文件嵌套列表).它包含异构对象(文件夹和文件)这一事实使得编写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)

views ember.js

5
推荐指数
1
解决办法
866
查看次数

为什么伪元素中不继承 CSS 变量?

我发现了一些奇怪的东西,并且在 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 伪元素访问。

为什么会这样?

css pseudo-element

5
推荐指数
1
解决办法
3219
查看次数

如何在EmberJS中都有动作错误和渲染模板

在我的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"路线上发生错误,会:

  1. 首先检查"ResetPasswordIndexRoute"上的"错误"操作.
  2. 然后尝试渲染"reset-password/error.hbs"(如果存在).
  3. 然后冒泡......直到它到达"application",最后在ApplicationRoute中找到"错误"动作.

但似乎很快就会定义一个"错误"动作,即使它在层次结构中更高,它也完全取代了可能在这里的任何模板......

我怎么能解决这个问题,仍然有两个错误处理程序?我试图在错误操作中调用"_super",但没有结果.

谢谢!

ember.js

2
推荐指数
1
解决办法
555
查看次数